大家好。对不起,如果之前已经问过(徒劳地搜索)或者真的很简单,但我就是无法理解。 MSDN definition Nullable 类型的声明,它是按以下方式定义的:
[SerializableAttribute]
public struct Nullable<T>
where T : struct, new()
所以问题很简单:这个定义怎么可能?或者这只是一个错字?每个值类型都有一个默认构造函数。事实上,当我尝试编译这样的东西时,编译器合理地说,同时应用两个约束是非法的,因为第二个约束隐式包含在第一个约束中。
提前致谢。
最佳答案
我认为这只是文档中的一个错误。如果您查看 Nullable<T>
在 Reflector 中键入或在 VS 中使用“Go To Definition”命令,它仅显示 struct
约束条件。
编辑
我又在想这个,我做了一个小测试:
var attributes = typeof(Nullable<>).GetGenericArguments()[0].GenericParameterAttributes;
Console.WriteLine(attributes);
此代码产生以下输出:
NotNullableValueTypeConstraint, DefaultConstructorConstraint
所以根据反射,T
在Nullable<T>
确实有 new()
约束...这意味着即使它在 C# 中无效,它也必须对 CLR 有效。
所以文档既对又错:T
是真的在Nullable<T>
具有“默认构造函数”约束,但它显示的 C# 声明是错误的...
这实际上并不奇怪,因为文档是从程序集元数据(当然还有 XML 注释)生成的。文档生成器中一定有错误...
关于c# - 对 Nullable<T> 约束的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596226/