我正在自学C#参考,它提供了以下信息:
1.21.4。声明通用参数 可以在类,结构,接口,委托的声明中引入通用参数(请参阅即将出现的“代理”部分)和方法。其他构造(如属性)不能引入泛型参数,但可以使用泛型参数。例如,属性Value使用T:
public struct Nullable<T>
{
public T Value {get;}
}
首先,我在尝试编译时遇到错误,说它必须包含一个正文,因为它既不是抽象也不是外部,或者自动参数必须同时具有get和set访问器。
其次,假设它是错误的并且我通过添加“set;”来纠正它,我似乎无法成功地格式化它。
答案 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
}