2015-01-08 51 views
2

比方說,我有以下的通用類:不能匿名類型傳遞給通用構造

public class Control<TItem> 
{ 
    public Control(TItem item) 
    { 
    } 
} 

當我嘗試匿名類型的對象傳遞給構造函數,編譯失敗:

var objectOfAnonymousType = new { Foo = "bar" }; 

// cannot compile: 
var control1 = new Control(objectOfAnonymousType); 

但是,如果我這樣做不是通過構造函數,而是通過類以外的一般方法,似乎工作:

// can compile: 
var control2 = CreateControl(objectOfAnonymousType); 
使用

工廠方法:

static Control<TItem> CreateControl<TItem>(TItem item) 
{ 
    return new Control<TItem>(item); 
} 

我無法理解這種限制背後的原因。任何人都可以解釋?

+0

http://stackoverflow.com/questions/45604/why-doesnt-c-sharp-support-implied-generic-types-on-class-constructors,http://stackoverflow.com/questions/280172/create -generic-class-instance-based-on-anonymous-type,http://stackoverflow.com/questions/3570167/why-cant-the-c-sharp-constructor-infer-type – CodeCaster

+0

你得到的錯誤信息應該是對於問題的具體描述。 – Servy

+0

這實際上與匿名類型完全無關。這也不適用於常規類類型,因爲構造函數不支持泛型類型推斷。查看@servy的答案。 – Kyle

回答

4

構造函數不支持泛型類型推斷(還)。他們要求你明確列出該類型的泛型參數。當泛型參數是匿名類型時,即使您想要,也不可能這樣做。

通用方法對它們的泛型參數的支持類型推斷。這並不總是可能的,但情況往往如此。