2014-12-19 49 views
1

有沒有辦法讓一個C#泛型方法接受一個具有默認參數的類型的新約束?我試圖用下面的TestGenerics<PublicDefaultParameter>()來做到這一點,它給了一個CS0310「必須有一個公共無參數構造函數」的錯誤。C#泛型奇怪的內部和默認參數行爲

有沒有辦法讓內部C#泛型方法調用內部構造函數?我試圖用下面的TestGenerics<InternalParameterless>()來做到這一點,並得到了同樣的錯誤。

作爲一名經驗豐富的C#程序員,在其他語言方面有豐富的經驗,這些限制對我來說似乎完全是任意的 - 有沒有辦法理解這一點?

public class PublicParameterless 
{ 
    public PublicParameterless() {} 
} 

public class PublicDefaultParameter 
{ 
    public PublicDefaultParameter(int i=0) {} 
} 

public class InternalParameterless 
{ 
    internal InternalParameterless() {} 
} 

public class Test 
{ 
    public static T TestGenerics<T>() where T : new() 
    { 
     return new T(); 
    } 

    public static InternalParameterless TestNonGenericCaller() 
    { 
     return new InternalParameterless(); 
    } 

    public static void Main() 
    { 
     TestGenerics<PublicParameterless>(); 

     //TestGenerics<PublicDefaultParameter>(); // error CS0310: The type `PublicDefaultParameter' must have a public parameterless constructor... 

     //TestGenerics<InternalParameterless>(); // error CS0310: The type `InternalParameterless' must have a public parameterless constructor.. 

     TestNonGenericCaller(); 
    } 
} 
+1

不;你不能這樣做。 – SLaks 2014-12-19 01:22:19

+0

@SLaks:謝謝。有沒有一個簡單的心理模型來理解這一點?這似乎完全是任意的。我的大部分經驗都是用C++和Python編寫的,每次我嘗試用C#編程時,都覺得這是一種半英語的語言,但我希望我只是在C#中應該有一個壞的心理模型。 – JDiMatteo 2014-12-19 01:24:31

+0

@弗拉德,謝謝,請移動評論回答,我會接受它。 – JDiMatteo 2014-12-19 01:31:37

回答

1

默認參數確實是調用者網站上的語法糖。從框架的角度來看,它只是一個參數的構造函數。 (正如心智模型一樣:C#中的許多結構不是編譯時語法結構,而是編譯代碼中存在的真正的烘焙結構,尤其是編譯代碼中存在泛型,與C++不同模板類在運行時只是一個類,同樣的故事是用默認參數:它不是句法可調性。)