为什么字符串或对象类型不支持可空引用类型?

时间:2014-01-20 11:34:11

标签: c# nullable

查看以下代码块:

//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'

我读过好几次但仍然无法理解。任何人都可以澄清这个吗?为什么objectstring不支持可空引用类型?

3 个答案:

答案 0 :(得分:8)

objectstring是引用类型,因此它们已经可以为空。例如,这已经有效:

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