2013-02-12 39 views
2

如果有下面的類:爲什麼我不能叫有泛型參數的構造函數,如果我指定的基類

class A 
{ 
    public A(int number) 
    { 
    } 
} 

那爲什麼我不能有一個泛型類像這樣的:

class B<ParameterClass> where ParameterClass : A 
{ 
    public B() 
    { 
     ParameterClass a = new ParameterClass(1); 
    } 
} 

我得到一個CS0304,編譯器說我沒有new()限制,但我只想調用在A上定義的構造函數,因爲ParameterClass將始終爲A編譯器可以確保A(int數)構造函數將始終存在。我只是不明白爲什麼會有這個限制。

回答

7

僅僅因爲在A上聲明構造函數並不意味着它將在ParameterClass上聲明。例如:

public class Bad : A 
{ 
    public Bad(string x) : base(x.Length) 
    { 
    } 
} 

現在我用:

var b = new B<Bad>(); 

什麼,你會期望呢?你寫的方式,如果它有效我希望它嘗試撥打new Bad(1),這當然是無效的。

+0

+1非常好的樣品傳遞的一個實例B的構造函數旁邊的where ParameterClass: A 2013-02-12 18:13:29

2

你誤會了泛型。

ParameterClass並不總是A
相反,它將始終是A或繼承A的類型。

繼承A的類型不一定具有與A相同的構造函數。

0

您需要一個where子句來限制參數類型,以便您知道它將具有某些方法。你仍然不能這樣構造它,因爲繼承A的類可能沒有這樣的構造函數。

如何在聲明

相關問題