2009-12-02 41 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")