簡體   English   中英

需要幫助了解C#generics

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM