2010-04-07 61 views
10

祝贺大家。对不起,如果之前已经问过这个问题(徒劳地搜查过)还是非常简单,但我无法得到它。可空类型的MSDN definition,声明,它以如下方式确定:关于可空的<T>约束的困惑

[SerializableAttribute] 
public struct Nullable<T> 
where T : struct, new() 

所以,问题是很简单:这是怎么定义的可能吗?或者这只是一个错字?每个值类型都有一个默认的构造函数。事实上,当我尝试编译这样的东西时,编译器合理地说,同时应用两个约束是非法的,因为第二个隐含地包含在第一个中。

在此先感谢。

回答

12

我认为这只是文档中的一个错误。如果您查看反射器中的Nullable<T>类型或使用VS中的“转到定义”命令,它只会显示struct约束。


编辑

我有关又在想,我做了一个小测试:

var attributes = typeof(Nullable<>).GetGenericArguments()[0].GenericParameterAttributes; 
Console.WriteLine(attributes); 

此代码产生以下输出:

NotNullableValueTypeConstraint, DefaultConstructorConstraint

所以根据反映,TNullable<T>确实new()约束......这意味着,即使它在C#中无效的,它必须是有效的CLR。

因此文档是正确和错误:这是真的,在TNullable<T>有“默认构造函数”的约束,但C#声明它显示是错误的...

其实,这是不是很奇怪,因为文档是从汇编元数据(当然还有XML注释)生成的。必须有在文档生成一个错误......

3

如果你看看IL拆卸,你可以看到,它确实有一个构造函数约束:如果文件是从直接生成

.class public sequential ansi serializable sealed beforefieldinit Nullable<valuetype (System.ValueType) .ctor T> 

程序集元数据,也许这是原因?

5

C#要求值类型具有默认的公共构造函数,但CLR不需要。

如果您定义了一种支持此类型的结构定义的语言(我相信C++/CLI允许这样做),那么调用它的时间就会不明确。