需要帮助了解C#generics

时间:2009-03-30 12:07:14

标签: c# visual-studio

我正在自学C#参考,它提供了以下信息:

1.21.4。声明通用参数 可以在类,结构,接口,委托的声明中引入通用参数(请参阅即将出现的“代理”部分)和方法。其他构造(如属性)不能引入泛型参数,但可以使用泛型参数。例如,属性Value使用T:

public struct Nullable<T>
{
  public T Value {get;}
}

首先,我在尝试编译时遇到错误,说它必须包含一个正文,因为它既不是抽象也不是外部,或者自动参数必须同时具有get和set访问器。

其次,假设它是错误的并且我通过添加“set;”来纠正它,我似乎无法成功地格式化它。

5 个答案:

答案 0 :(得分:8)

这只是显示Nullable<T>的API,而不是实现。它不是要编译的 - System.Nullable<T>是框架的一部分,你不必自己实现它。

答案 1 :(得分:3)

您似乎正在阅读“坚果壳中的C#3.0”。嗯,这个例子只是一个例子。它仅用于说明Generic Value类的Nullable属性如何公开包含类型声明的泛型参数。

它并不意味着成为可编译示例的一部分。

答案 2 :(得分:2)

我不确定你是否只为你的结构名称选择了一个坏例子(因为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都指出的那样,它可能只是展示仿制药运作的一个例子。

答案 3 :(得分:1)

对于自动属性,您始终需要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; }

答案 4 :(得分:0)

这里的问题似乎是关于自动属性,而不是泛型。

自动属性必须具有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
}