[英]Need help understanding C# generics
我正在自學C#參考,它提供了以下信息:
1.21.4。 聲明通用參數可以在類,結構,接口,委托的聲明中引入通用參數(請參閱即將發布的“代理”部分)和方法。 其他構造(如屬性)不能引入泛型參數,但可以使用泛型參數。 例如,屬性Value使用T:
public struct Nullable<T>
{
public T Value {get;}
}
首先,我在嘗試編譯時遇到錯誤,說它必須包含一個正文,因為它既不是抽象也不是外部,或者自動參數必須同時具有get和set訪問器。
其次,假設它是錯誤的,我通過添加“set;”來糾正它,我似乎無法成功地格式化它。
這只是顯示Nullable<T>
的API而不是實現。 它不是要編譯的 - System.Nullable<T>
是框架的一部分,你不必自己實現它。
您似乎正在閱讀“堅果殼中的C#3.0”。 嗯,這個例子只是一個例子。 它僅用於說明Generic Nullable
類的Value
屬性如何公開包含類型聲明的泛型參數。
它並不意味着成為可編譯示例的一部分。
我不確定你是否只為你的結構名稱選擇了一個壞例子(因為Nullable是一個框架結構),但如果沒有,那么錯誤是由於你的屬性中沒有set accessor這一事實。 自動屬性(在C#3.0中添加)需要get和set屬性。 因此,如果您將代碼更改為:
public struct Nullable<T>
{
public T Value {get; set; }
}
它應該工作。 在這種情況下,錯誤與泛型無關。 要創建實例,您可以使用:
Nullable<int> i = new Nullable<int>();
這將使它編譯。 然而,正如Jon和Cerebrus都指出的那樣,它可能只是展示仿制葯運作的一個例子。
對於自動屬性,您始終需要getter和setter。 如果沒有吸氣劑,您可以設置值,但沒有任何東西可以檢索它。 沒有setter,值永遠是默認值,因為沒有任何東西可以設置它:
//tradition
private T _value;
public T Value
{
get
{
return _value;
}
}
//locally, _value can always be set
//Auto-matically implemented property
public T Value { get; }
//there is never a way to set it
//with this it can be privately set, but is get only to everyone else
public T Value{ get; private set; }
你的問題似乎是關於自動屬性,而不是泛型。
自動屬性必須具有set訪問器,盡管它不必具有與get相同的可見性:
public T Value { get; private set; }
您可以在構造函數中調用該集合:
public Nullable ( T value ) {
Value = value;
}
雖然在這種情況下你正在處理一個結構,並且它們總是有一個默認的(無參數)構造函數 - 你必須對結構和自動屬性更加小心。
在.net中已經有一個可以為空的泛型:
Nullable<int> i = GetCounterThatMightBeNull();
int j = 0;
if( i.HasValue )
j = i.Value;
...
這是在.Net 2中添加的(與泛型相同),雖然早期的beta看起來像上面的代碼,但它們簡化了最終版本:
//int? is shorthand for Nullable<int>
int? i = GetCounterThatMightBeNull();
// ?? is shorthand for the null check
int j = i ?? 0;
//or
if( i == null ) {
//this works even though Nullable<int> is a struct
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.