查看以下代码块:
//Declaring nullable variables.
//Valid for int, char, long...
Nullable<int> _intVar;
Nullable<char> _charVar;
//trying to declare nullable string/object variables
//gives compile time error.
Nullable<string> _stringVar;
Nullable<object> _objVar;
编译代码编译器时会出现以下错误消息:
类型'string'/'object'必须是非可空值类型才能在泛型类型或方法'System.Nullable'中将其用作参数'T'
我读过好几次但仍然无法理解。任何人都可以澄清这个吗?为什么object
或string
不支持可空引用类型?
答案 0 :(得分:8)
object
和string
是引用类型,因此它们已经可以为空。例如,这已经有效:
string x = null;
Nullable<T>
泛型类型仅适用于T
是不可为空的值类型的情况。
在Nullable<T>
的声明中,T
有一个约束:
public struct Nullable<T> where T : struct
where T : struct
恰好是将T
限制为不可为空的值类型的部分。
答案 1 :(得分:4)
Nullable<T>
定义为:
public struct Nullable<T> where T : struct
含义:它仅适用于值类型T
(不包括Nullable<TSomethingElse>
本身)。
您无法在引用类型(或Nullable<T>
)上使用Nullable<T>
,但您不需要所有引用类型(包括object
和{{1} }}已经是&#34;可以为空的&#34;,因为你可以为它们分配string
。
答案 2 :(得分:3)
字符串和对象是引用类型,因此已经是“可空”的。 Nullable<T>
类型作为值类型的包装器存在,不支持null
开箱即用。
string myString = null //fine
int myInt = null //compiler error