繁体   English   中英

为什么选择泛型函数成员而不是非泛型函数?

[英]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更好的功能成员应用的第一个鉴别器是:

  • 如果MP和MQ中的一个是非泛型的,但另一个是通用的,那么非泛型更好。

我错过了什么或编译错误?

你错过了什么。 这是以下内容:

您使用一个参数调用该方法。 只有一种方法有一个参数,即通用参数。 这就是所选择的那个。

只有在找不到匹配方法时,才会查看带有可选参数的其他方法。

参考文献:

  1. C#4.0规范 ,21.4中的最后一段:

    作为一个平局规则,一个函数成员,其中显式给出的所有参数都优于提供默认值的一个参数,而不是显式参数。

  2. MSDN ,标题为“重载分辨率”,最后一个要点:

    如果判断两个候选者同样好,则优先选择没有可选参数的候选者,该参数在调用中被省略。 这是对具有较少参数的候选者的重载分辨率的一般偏好的结果。

  3. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM