2013-11-01 79 views
0

有沒有辦法限制T的打字,以便能夠將默認值添加到函數參數中?使用通用函數參數的默認值

public class Identity<T> 
{ 
    public readonly T Seed; 
    public readonly T Increment; 

    public Identity(T seed = 1, T increment = 1) 
    { 
     Seed = seed; 
     Increment = increment; 
    } 
} 

這是我希望能夠做的,也許限制噸至非十進制數字類型,比如short,int和長T seed = 1 ...

+0

感覺這樣可能會受益於一些額外的抽象,看到類似的排序問題/答案:http://stackoverflow.com/questions/3140666/where-t-multiple - 類 我的確認爲,也許你可以用另一種方式來工作,雖然沒有看到你如何使用它,但很難確切地說出可能的形狀。也許從實現一個IKeyField開始? –

+1

這不是重複的! OP希望能夠在泛型類的參數定義中使用**默認值**!雖然實際上,有針對性的問題部分地回答「不能完成」,因爲你不能將T限制爲數字,但它不是「足夠重複」的。 – quetzalcoatl

+0

@quetzalcoatl這個問題還提到,「我希望能夠做到,也許將T限制爲像short,int,long這樣的非十進制數字類型」,爲了讓給定的默認參數是合理的,需要完成這些操作。 – Servy

回答

0

實際的問題是,有(可能)沒有辦法在所有指定類型T的參數的默認值..

IF你可以做到這一點(我不記得),比你能註明:

T param1 = null  // for T: class 
T param1 = default(T) // for T: any 
// T param1 = new T() // for T: new() -- cannot be possible, see Servy's comment 

因爲沒有其他「構造函數」可用於泛型類型參數T!

的編譯器將T爲具有任何操作和沒有構造和比由where子句和/或總是從object繼承而來的未指定鑄造/其他轉換的Object。既然你只能指定上述的操作/要求..我認爲這是不能做到的。泛型不是C++模板;)

+0

默認值必須是*文字*。你列出的前兩個選項是文字,所以它們會正常工作(儘管'null'需要類型爲空,這意味着類約束)。第三不是,所以不會。沒有其他文字可以分配給'T',但是如果任何文字被添加到語言中,默認參數的規格不需要改變。 – Servy

+0

謝謝!這是事實,我沒有注意到這一點,因爲我正在以一般的術語思考。我會把你的澄清記錄下來。 – quetzalcoatl

0

只能設置,可以在編譯時進行評估,並可以轉換爲T.一個實例的所有可能值「默認」值是使用default

public void Add(T parent = default(T)) 
{ 
    .... 
} 

除非您想將「0」視爲「魔術」的情況並將其視爲「1」,否則這不適用於您的情況。但是,如何在不將T限制爲數值的情況下實現它? (你也不能用泛型來做)