2015-02-05 45 views
-3

我想通過一個通用列表到一個函數,將添加一個新項目的列表。我有以下的剝離下來的例子:通用方法添加新T到列表T

private void SetBayNumb<T>(ObservedList<T> bayList) where T : IBaySpec, new() 
    { 
    var bay = new T(); 
    bayList.Add(bay); 
    } 

的方法調用它有這個錯誤:

The type T' must have a public parameterless constructor in order to use it as parameter T' in the generic type or method

正是我試圖做可能嗎?我覺得它一定是因爲編譯器不應該關心它是什麼樣的列表 - 它只需要調用公共的無參數構造函數並將新實例添加到已傳入的現有列表中。

我猜對了問題是,接口不出示擔保其實施者將有一個公共的構造,但即使我給它一個具體的類我得到這個錯誤:

The type T' must be convertible to BayClass' in order to use it as parameter `T' in the generic type or method

將是任何指針非常感謝。

+1

您正在收到錯誤,因爲您指定的類型不符合通用約束條件。 – 2015-02-05 22:02:27

+1

顯示調用它的方法 - 顯然它使用的是一個沒有公共無參數構造函數的類型(記住構造函數沒有被繼承) – 2015-02-05 22:02:40

+1

閱讀錯誤信息它告訴你到底發生了什麼錯誤。 – MethodMan 2015-02-05 22:03:17

回答

3

我想調用代碼看起來像

void Method<T>(ObservedList<T> bayList) 
{ 
    SetBayNumb<T>(bayList); 
} 

問題來自於這樣的事實存在MethodT沒有限制,因此編譯器不能爲SetBayNumb匹配參數。

請注意,泛型類型名稱只是名稱 - 你可以選擇任何你喜歡的名稱,它可以幫助推理錯誤。重寫用同樣的方法命名不同一般的參數,如:

void Method<TArg>(ObservedList<TArg> bayList) 
{ 
    SetBayNumb<TArg>(bayList); 
} 

提供了更好的錯誤:

The type 'TArg' must have a public parameterless constructor in order to use it as parameter 'T' in the generic type or method

注意,有2種涉及錯誤(這是很難看的時候都被稱爲不同類型相同的「T」)。

修正:

  • 指定上外通用方法(Method<TArg>(ObservedList<TArg> bayList) where TArg : ... new()
  • 相同的限制上通用類級而不是個別方法指定T
  • 同時滿足要求(類項通具體類在列表中應該實現接口並且具有無參數的構造函數)。
+0

重命名T的好技巧,讓錯誤變得清晰。我的調用函數如你所說,但與IBay約束...但沒有新()。添加,修復它。 – DBHC 2015-02-06 10:23:17

+0

讓我檢查我理解爲什麼 - 是否因爲編譯器現在可以安全地說TArg傳遞給SetBayNumb函數,符合new()約束?否則它不知道它傳遞的類型是否具有正確的構造函數。 – DBHC 2015-02-06 10:32:11

+0

@DBHC - 是的。如果TArg的約束少於T,那麼你可以將更多的類型作爲TArgs傳遞,並且其中很多不會滿足T的約束 - 所以編譯器確實需要停止它。 – 2015-02-06 15:35:49

5

投訴不是關於名單,而是關於T。如果您有ObservedList<MyClass>並將其傳遞給SetBayNumb()MyClass必須實現IBaySpec並且它必須具有無參數構造函數:public MyClass() { ... }。爲什麼?因爲這就是where T : IBaySpec, new()所說的。如果刪除where子句,錯誤將消失,但您將不能再說new T()

+0

很好的解釋,但我認爲它是答案的一半 - 錯誤消息中有兩個「T」,它們是不同的(我的答案試圖顯示問題的後半部分)。 – 2015-02-05 22:47:36

+0

@AlexeiLevenkov:好點;我爲此回答了你的回答。 – 2015-02-05 22:55:19