需要帮助理解C#泛型吗

需要帮助理解C#泛型吗,c#,visual-studio,C#,Visual Studio,我正在自学C#参考资料,它提供了以下信息: 1.21.4。声明泛型参数 泛型参数可以在类、结构、接口、委托(请参阅下面的“委托”部分)和方法的声明中引入。其他构造(如属性)不能引入泛型参数,但可以使用泛型参数。例如,属性值使用T: public struct Nullable<T> { public T Value {get;} } 公共结构可为空 { 公共T值{get;} } 首先,我在编译时遇到一个错误,它必须包含一个主体,因为它既不是抽象的也不是外部的,或者自动参数必须

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

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

public struct Nullable<T>
{
  public T Value {get;}
}
公共结构可为空
{
公共T值{get;}
}
首先,我在编译时遇到一个错误,它必须包含一个主体,因为它既不是抽象的也不是外部的,或者自动参数必须同时具有get和set访问器


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

这只是显示了
Nullable
的API,而不是实现。它不是要被编译的-
系统。Nullable
是框架的一部分,您不必自己实现它。

您似乎正在阅读“C#3.0简而言之”。这个例子就是一个例子。它仅用于说明泛型
null
类的
Value
属性如何公开包含类型声明的泛型参数


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

我不确定您是否为结构名称选择了一个不好的示例(因为Nullable是一个框架结构),但如果不是,则错误是由于您的属性中没有set访问器。自动属性(在C#3.0中添加)需要get和set属性。因此,如果将代码更改为:

public struct Nullable<T>
{
  public T Value {get; set; }
}
公共结构可为空
{
公共T值{get;set;}
}
它应该会起作用。在本例中,错误与泛型无关。要创建实例,可以使用:

Nullable<int> i = new Nullable<int>();
Nullable i=new Nullable();

这将使它能够编译。然而,正如Jon和Cerburus都指出的那样,这可能只是展示泛型工作原理的一个例子。

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

自动属性必须具有集合访问器,尽管它不必具有与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;
...
Nullable i=getcounterthatthattbenull();
int j=0;
如果(i.HasValue)
j=i.值;
...
这是在.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
} 
//int?是Nullable的缩写
智力?i=GetCounterThat hat mightbenull();
// ?? 是空校验的简写
int j=i??0;
//或
如果(i==null){
//即使Nullable是一个结构,它也可以工作
} 

对于自动属性,始终需要getter和setter。如果没有getter,您可以设置值,但任何东西都无法检索它。如果没有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”不见了。但是,他们没有显示呼叫。在我尝试使用该方法的各种尝试中,我错过了方程式左侧的答案。这个答案马上就解决了这个问题。谢谢