必须为扩展方法明确指定通用参数类型时有哪些规则?

时间:2015-06-15 19:18:58

标签: c#

关于以下扩展方法:

public static class Extensions
{
    public static void P<T>(this T value) { }

    public static TResult F<T, TResult>(this T value)
    {
        return default(TResult);
    }
}

当我尝试将这些选项与各种类型参数一起使用时,我得到以下结果:

1.P(); // Compiler just fine
1.P<int>(); // R# says "Type argument specification is redundant"
var x = 1.F<int, int>(); // Compiler just fine
var y = 1.F<int>(); // Compiler error: Incorrect number of type parameters

那么为什么编译器可以推断T P的类型,但不能推断出F的相同内容?有关这种推理的规则是什么,有没有办法可以避免指定类似的类型?

1 个答案:

答案 0 :(得分:1)

C#5.0规范的第7.5.2节涵盖了类型推断,并详细说明了确定类型推断何时能够成功和不能成功的所有规则。

至于你的两个例子,第一种情况是有一个被推断的类型的参数,它允许推断它,而在你的第二个例子中你有一个没有上限或下限的类型参数,如没有任何参数使用任何形式的类型,允许应用上限或下限。

请注意,无法推断方法的某些泛型类型参数,但不是全部。它们都可以被推断出来,或者所有都必须被明确提供,这就是为一个期望两个方法提供一个泛型类型参数时出错的原因,即使其中一个可以被推断出来。