[英]Why is a generic function member chosen over a non-generic one?
public enum EnumTest
{
EnumEntry
}
public class TestClass
{
public string FunctionMember(string s, EnumTest t = EnumTest.EnumEntry)
{
return "Normal";
}
public string FunctionMember<T>(T t)
{
return "Generic";
}
}
class Program
{
static void Main(string[] args)
{
TestClass t = new TestClass();
Console.WriteLine(t.FunctionMember("a"));
}
}
这打印“通用”。 删除, EnumTest t = EnumTest.EnumEntry
使其打印为“正常”。
然而标准似乎很清楚,从14.4.2.2更好的功能成员应用的第一个鉴别器是:
我错过了什么或编译错误?
你错过了什么。 这是以下内容:
您使用一个参数调用该方法。 只有一种方法有一个参数,即通用参数。 这就是所选择的那个。
只有在找不到匹配方法时,才会查看带有可选参数的其他方法。
参考文献:
C#4.0规范 ,21.4中的最后一段:
作为一个平局规则,一个函数成员,其中显式给出的所有参数都优于提供默认值的一个参数,而不是显式参数。
MSDN ,标题为“重载分辨率”,最后一个要点:
如果判断两个候选者同样好,则优先选择没有可选参数的候选者,该参数在调用中被省略。 这是对具有较少参数的候选者的重载分辨率的一般偏好的结果。
C#语言规范 ,章节“7.5.3.2更好的功能成员”:
每个候选函数成员的参数列表按以下方式构造:
- 如果函数成员仅适用于扩展形式,则使用扩展形式。
- 从参数列表中删除没有相应参数的可选参数
它继续这样:
给定一个参数列表A,其中包含一组参数表达式{E 1 ,E 2 ,...,E N }和两个适用的函数成员MP和MQ,参数类型为{P 1 ,P 2 ,...,P N }和{Q 1 ,Q 2 ,...,Q N } [...]
此时,带有可选参数的方法已经不在游戏中。 N
是1,但该方法有两个参数。
使用方法参数的默认值,可以扩展重载决策。
从概念上讲,将运行v4之前的方法重载分辨率。 如果找到匹配的匹配项将被使用。 (从概念上讲,因为这不是对它如何工作的描述,而是你如何看待它)
在您的情况下,它只找到一个匹配作为您的通用方法
如果找不到匹配项,它将查找具有部分匹配的方法以及可以使用默认值完成匹配的方法。 在你的情况下,你可以在这次运行中找到无通用的方法,但由于已经找到匹配,因此分辨率永远不会出现。
删除第二个参数时,最终会出现通用和非通用匹配的情况。 你挑选非一般性的规则。
总而言之,一个好的经验法则是选择最具体的可用方法。
匹配的非泛型方法比泛型更具体,因为类型不能改变。 如果两个方法可用但是一个接受IFoo参数而另一个接受Foo(实现IFoo),则默认参数的方法不如参数计数与参数计数匹配的方法(数字是完全匹配)的特定方法在将Foo对象作为参数传递时将选择后者,因为它是完全匹配的。 更加具体
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.