2011-04-01 59 views
6

在.NET中,似乎有兩種方法可將類型傳遞給方法或類。第一種是通過泛型,我們在其中傳遞一個類型作爲特殊參數。typeof(T)vs <T>

如:

var list = new List<MyClass>(); 

的另一種方法是顯式使用typeof運營商如:

var pe = Expression.ParameterExpression(typeof(MyClass), "myinstance"); 

我的問題是關於在一個統一的接口,需要一個類型的方法的差異參數。爲什麼不能按照如下方式完成上述說明?:

var pe = Expression.ParameterExpression<MyClass>("myinstance"); 

是否因爲編譯器的行爲方式需要兩種語義差異?當編譯器處理泛型參數時,它是否簡單地執行替換ala lambda演算?鑑於typeof風格的方法需要Type類的實際實例來推斷屬性和屬性?

謝謝。

+3

這些「特殊參數」被稱爲類型參數,所以你知道:) – 2011-04-01 18:06:12

+0

想象一下廣闊的太平洋。 Type在日本,T在加利福尼亞州。 T比夏威夷快上千倍。 – 2011-04-01 19:13:22

+0

@Richard。我意識到。我不知道爲什麼我這樣表達。泛型在學術上被稱爲參數多態性,所以類型參數緊隨其後。 – 2011-04-01 19:35:23

回答

6

第一種方法允許您在運行時計算所需的類型。

Expression.ParameterExpression(CalculateType(), "myinstance"); 

就我個人而言,我不介意看到一個重載,它肯定會使編譯時定義的類型的代碼更清晰。

+0

什麼是顯而易見的原因!我無法相信我忽略了這一點!謝謝。 – 2011-04-01 19:33:21

0

從技術上講,一個通用版本可以很容易地創建,因爲它可以調用,需要一個類型,如過載:雖然

public static ParameterExpression Parameter<T>(string name) { 
    return Parameter(typeof(T), name); 
} 

在這種情況下,使用一個通用的不買你多少。如果其中一個參數的類型爲T或者返回值的類型爲T,那麼您將根據指定的類型參數進行強類型化。

添加一個通用版本的Parameter方法並沒有使其具有更強或更弱的類型。

2

With var list = new List<MyClass>(); List類在編譯時被告知它被綁定到一個特定的類型。然後,編譯器可以進行類型檢查,以確保只有MyClass的元素被添加到列表中。

With var pe = Expression.ParameterExpression(typeof(MyClass), "myinstance");該表達式在運行時告訴它正在使用哪種類型的參數。編譯器無法使用此方法進行強類型檢查。在編譯時無法確定事物的動態代碼更好,但這些情況很少(儘管表達式樹是其中之一)。

3

考慮這種方法簽名。

public object MyGetInstanceOfType(Type theType) 

雖然可能返回相應類型的實例,編譯器沒有辦法驗證它... theType不知道(編譯涉及好後),直到運行時。

與此不同的:

public T MyGetInstanceOfType<T>() 

這裏編譯器知道類型的每一個呼叫使用此方法時。它可以保證方法的返回,因爲它知道所有調用的類型。

相關問題