关于以下扩展方法:
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
的相同内容?有关这种推理的规则是什么,有没有办法可以避免指定类似的类型?
答案 0 :(得分:1)
C#5.0规范的第7.5.2节涵盖了类型推断,并详细说明了确定类型推断何时能够成功和不能成功的所有规则。
至于你的两个例子,第一种情况是有一个被推断的类型的参数,它允许推断它,而在你的第二个例子中你有一个没有上限或下限的类型参数,如没有任何参数使用任何形式的类型,允许应用上限或下限。
请注意,无法推断方法的某些泛型类型参数,但不是全部。它们都可以被推断出来,或者所有都必须被明确提供,这就是为一个期望两个方法提供一个泛型类型参数时出错的原因,即使其中一个可以被推断出来。