C# 为什么这个涉及隐含泛型类型的静态工厂方法有效?

C# 为什么这个涉及隐含泛型类型的静态工厂方法有效?,c#,generics,C#,Generics,考虑 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<

考虑

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);
    }
}
公共类元组
{
公共元组(T1 v1,T2 v2)
{
V1=V1;
V2=V2;
}
公共T1 V1{get;set;}
公共t2v2{get;set;}
}
公共静态类元组
{
//魔术!!
新的公共静态元组(T1 v1,T2 v2)
{
返回新的元组(v1,v2);
}
}
为什么上面标有“MAGIC”的部分起作用?它允许像这样的语法
Tuple.New(1,“2”)
代替了
newtuple(1,“2”)
,但是。。。如何以及为什么


为什么我不需要Tuple.New(1,“2”)?

这是“类型推断”。有关详细信息,请参阅一篇优秀文章。

这称为泛型类型推断,它仅适用于泛型方法。您可以将任何类型的实例作为参数传递给
New
,编译器推断您的意思是返回与参数匹配的特定泛型元组,如
Tuple

它有什么神奇之处?您有两种类型,一种接受泛型类型参数,另一种不接受泛型类型参数。它们共享相同的名称,但类型不同。尝试重命名其中一个,看看它是否对您更有意义

/克劳斯

C#编译器自动推断类型并编译您的

Tuple.New(1, "2")

Tuple.New(1,“2”)

在我看来,这是C#更有趣的特性之一。这比你这里简单的例子要复杂得多。如果您对一些更复杂的场景感兴趣,下面是我对它们制作的视频:
Tuple.New<int,string>(1, "2")