c# - 对 Nullable<T> 约束的困惑

标签 c# .net nullable

大家好。对不起,如果之前已经问过(徒劳地搜索)或者真的很简单,但我就是无法理解。 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

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

所以文档既对又错:T 是真的在Nullable<T>具有“默认构造函数”约束,但它显示的 C# 声明是错误的...

这实际上并不奇怪,因为文档是从程序集元数据(当然还有 XML 注释)生成的。文档生成器中一定有错误...

关于c# - 对 Nullable<T> 约束的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596226/

相关文章:

C# WPF 属性网格文件浏览器

c# - 如何使用 gridview 处理数据库的空返回?

c# - WPF 按钮内容绑定(bind)

javascript - 如何使用 html 和 javascript 调用 Web 服务

C# 可空整数 - 编译错误

xml - XSD - 可以为空的枚举限制值

c# - 您如何设置解决方案配置特定的配置文件?

.net - 将 DateTime 序列化为没有毫秒和 gmt 的时间

c# - 如何通过删除 if 检查使代码面向对象?

flutter - Dart比较int null安全问题: operator can't be unconditionally invoked because the receiver can be 'null'