Nullable的定义是:
[SerializableAttribute]
public struct Nullable<T> where T : struct, new()约束where T : struct意味着T只能是一个值类型。所以我很清楚我不能写:
Nullable<string> a; //error. makes sense to me因为string是引用类型,而不是值类型。但我真的不明白为什么我不能写
Nullable<Nullable<int>> b; //error. but why?为什么不允许?毕竟,Nullable<int>是一个值类型,因此它可以是Nullablle<T>的类型参数。
当我在ideone上编译它时,它给出了这个错误(意为):
错误CS0453:类型'int?‘必须为非空值类型,才能将其用作泛型类型或方法“System.Nullable”编译中的类型参数'T‘,失败:1错误,0警告
发布于 2011-09-29 12:25:18
因为它在C#规范中(4.4.4节):
如果约束是值类型约束(struct),类型A必须满足以下条件之一:
发布于 2011-09-29 12:27:35
来自C# 4规范第10.1.5节:
value type约束指定用于类型参数的类型参数必须是非空值类型。所有具有值类型约束的非空结构类型、枚举类型和类型参数都满足此约束。注意,尽管被归类为值类型,但可空类型(§4.1.10)并不满足值类型约束。具有值类型约束的类型参数也不能具有构造函数约束。
发布于 2016-11-10 13:12:57
正如其他人所说,规范禁止这样做。
深入挖掘,值得注意的是,您可以创建允许这种模式的自己的结构:
struct Nestable<T> where T : struct { /* ... */ }
new Nestable<Nestable<int>>(); // This works just fine禁止嵌套零标号不能用您和我可以使用的类型系统来表示。它仅由编译器(CS0453)中的特例强制执行。
旁白:问题中显示的new()约束实际上并不存在于System.Nullable<T>上。使用new()约束时禁止使用struct约束。
CS0451:'new()‘约束不能与'struct’约束一起使用
无论如何,所有结构都支持默认初始化。
https://stackoverflow.com/questions/7597218
复制相似问题