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")); } }
这将打印“通用”.删除,枚举t = EnumTest.EnumEntry使其打印“正常”.
而标准似乎很清楚,从14.4.2.2更好的功能成员第一个鉴别器应用是:
>如果MP和MQ之一是非通用的,而另一个是通用的,则非泛型更好.
我错过了一些或编译错误?
解决方法
您使用一个参数调用该方法.只有一个方法有一个参数,一个是泛型的.那就是选择的那个.
只有当它没有找到匹配的方法时,才会看到具有可选参数的其他方法.
参考文献:
> C# 4.0 Specification,最后一段在21.4:
As a tie breaker rule,a function member for which all arguments where explicitly given is better than one for which default values were supplied in lieu of explicit arguments.
If two candidates are judged to be equally good,preference goes to a candidate that does not have optional parameters for which arguments were omitted in the call. This is a consequence of a general preference in overload resolution for candidates that have fewer parameters.
> The C# Language Specification,“7.5.3.2更好的功能成员”一章:
Parameter lists for each of the candidate function members are constructed in the following way:
- The expanded form is used if the function member was applicable only in the expanded form.
- Optional parameters with no corresponding arguments are removed from the parameter list
它继续这样:
Given an argument list A with a set of argument expressions { E1,E2,…,EN } and two applicable function members MP and MQ with parameter types { P1,P2,PN } and { Q1,Q2,QN } […]