考虑
public class Tuple<T1, T2>
{
public Tuple(T1 v1, T2 v2)
{
V1 = v1;
V2 = v2;
}
public T1 V1 { get; set; }
public T2 V2 { get; set; }
}
public static class Tuple
{
// MAGIC!!
public static Tuple<T1, T2> New<T1, T2>(T1 v1, T2 v2)
{
return new Tuple<T1, T2>(v1, v2);
}
}
为什么在上面的工作中标有“MAGIC”的部分?它允许语法
Tuple.New(1, "2")
而不是new Tuple<int, string>(1, "2")
,但......如何以及为何?
为什么我不需要Tuple.New<int,string>(1, "2")
??
答案 0 :(得分:5)
这称为泛型类型推断,仅适用于通用方法。您可以将任何类型的实例作为参数传递给New
,并且编译器会推断您要返回与Tuple<int, string>
等参数匹配的特定通用元组...
答案 1 :(得分:3)
这是“类型推断”。有关详细信息,请参阅优秀文章here。
答案 2 :(得分:0)
它有什么神奇之处?您有两种类型,一种接受泛型类型参数,另一种不接受。它们具有相同的名称,但它们的类型不同。尝试重命名其中一个,看看它是否对你更有意义。
/克劳斯
答案 3 :(得分:0)
C#编译器自动推断类型并编译
Tuple.New(1, "2")
到
Tuple.New<int,string>(1, "2")