2009-12-02 43 views
0

考虑为什么这个静态工厂方法涉及隐含的泛型类型,工作?

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); 
    } 
} 

为什么会参与上述工作标有“魔力”?它允许类似于 Tuple.New(1, "2")而不是new Tuple<int, string>(1, "2")的语法,但是......如何以及为什么?我为什么不需要Tuple.New<int,string>(1, "2")

+1

这是C#的更有趣的(​​在我看来)的功能之一。这里比你的简单例子要复杂得多。如果你对一些更复杂的场景感兴趣,下面是我对他们做的一个视频:http://blogs.msdn.com/ericlippert/archive/2006/11/17/a-face-made-for-email -part-three.aspx – 2009-12-02 16:07:41

回答

5

这被称为泛型类型推断,它只适用于泛型方法。你可以通过任何你想要的类型作为参数New和编译器推断你的意思是返回的参数匹配像Tuple<int, string>特定的通用元组的情况下...

3

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

0

是什么魔力呢?你有两种类型,一种接受泛型类型参数,另一种不接受。他们分享相同的名字,但他们不是同一类型。尝试重命名其中一个,看看它是否对你更有意义。

/克劳斯

0

C#编译器自动推断类型和编译

Tuple.New(1, "2") 

Tuple.New<int,string>(1, "2")