C#3和C#4中扩展方法的区别

25 浏览
0 Comments

C#3和C#4中扩展方法的区别

我记得很久以前读过一篇文章,说C#3中只能将扩展方法应用于原始类型和接口;而在C#4中可以扩展任何类型。但这似乎与我现在看到的不符,我很难找到相关文档。\n这是否属实,还是我的记忆出了问题?\n关于哪些类型可以被扩展,有什么规定?\nC# 3和4之间有什么区别吗?

0
0 Comments

问题的出现的原因:

在这段对话中,提问者提到自己记得扩展方法只能用于IEnumerable<T>,但其他人对此进行了否认。提问者对此感到困惑,想知道是否是自己记错了。

问题的解决方法:

其他人指出提问者的记忆是错误的,扩展方法一直都可以用于IEnumerable<T>。提供了一个链接给提问者,链接中展示了一个在C#3中的扩展方法的例子,其中扩展方法是一个用于System.String的例子。其他人还提到,虽然IEnumerable<T>是一个接口,但这并不能回答提问者的问题。最后,提问者感谢了其他人的回答,并承认可能是自己在阅读问题时疏忽了。

文章整理如下:

是否有关于这个问题的真相,还是我记错了?

你记错了。扩展方法一直都可以用于IEnumerable<T>

编辑:

这是Fx3.5(C# 3)的MSDN链接,链接中的第二个例子是一个用于System.String的扩展方法的例子,String并不是一个原始类型。

但是,IEnumerable<T>是一个接口,所以这并不能回答他的问题 🙂

是的,可能是我阅读不仔细。大多数例子都是针对接口的。不过问题似乎已经得到解答了。

非常感谢。 (我在几秒钟后编辑了问题,添加了接口,可能是我的错。)

0
0 Comments

Differences between extension methods in C#3 & 4

在C#3和C#4之间的扩展方法之间没有任何规则的变化。根据我所知,并没有对规则进行任何更改。通过对相关规范文档的简单比较,似乎也证实了这一点。

原因:

这个问题的出现是因为有人声称在C#3和C#4之间的扩展方法有一些差异。然而,作者在仔细查阅了相关的规范文档后发现,这个声称是不正确的。

解决方法:

为了澄清这个问题,我们可以通过仔细研究C#3和C#4之间的扩展方法规则来查找差异。根据作者的分析,扩展方法的规则在这两个版本之间是没有变化的。

下面是C#3和C#4之间扩展方法规则的比较:

// C#3 extension method
public static class StringExtensions
{
    public static string ConvertToUppercase(this string input)
    {
        return input.ToUpper();
    }
}
// C#4 extension method
public static class StringExtensions
{
    public static string ConvertToUppercase(this string input)
    {
        return input.ToUpperInvariant();
    }
}

通过上面的比较可以看出,C#3和C#4之间的扩展方法规则是相同的。在这两个版本中,扩展方法仍然需要使用静态类和静态方法来定义,并且在方法名前使用this关键字来指定扩展的类型。

尽管有人声称在C#3和C#4之间的扩展方法存在差异,但根据仔细研究相关规范文档的结果,我们可以得出结论,C#3和C#4之间的扩展方法规则是相同的。因此,这个声称是错误的。

通过以上的比较和分析,我们可以确信在C#3和C#4之间的扩展方法规则是没有变化的。这为开发者提供了更好的理解和使用扩展方法的能力,并确保代码在不同的C#版本中保持一致性。

0
0 Comments

C#3与C#4中扩展方法的区别

扩展方法是C#中的一种特殊语法,允许我们向现有的类或接口添加新的方法,而无需修改它们的源代码。这种特性在C#3和C#4中都存在,但它们在一些方面有所区别。

问题的出现原因:

在上述问题中,有人提出了关于C#3和C#4中扩展方法的区别的问题。可能是因为他们在使用过程中遇到了一些问题,或者听说了一些关于这两个版本之间的差异的事情。为了解决这个问题,以下是对问题的解答:

解决方法:

首先,回答了问题中关于C#扩展方法可以扩展哪些类型的规则的问题。C#4规范的第7.6.5.2节给出了调用的规则,第10.6.9节给出了声明的规则。具体回答是:非托管指针类型不能被扩展。

然后,回答了问题中关于C#3和C#4之间是否存在差异的问题。回答是肯定的。C#4为处理"dynamic"类型添加了额外的规则。扩展方法并不是动态解析的,如果你有以下代码:

dynamic d = 10;
d.MyIntExtension();

那么动态语言运行时在int类型上找不到扩展方法。更多详情请参考[这里](https://stackoverflow.com/questions/258988)。

0