C# 为什么字符串或对象类型不';不支持可为空的引用类型?
查看以下代码块:C# 为什么字符串或对象类型不';不支持可为空的引用类型?,c#,nullable,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;
//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;
//声明可为空的变量。
//对int、char、long有效。。。
可为空的_intVar;
可为空的_charVar;
//试图声明可为空的字符串/对象变量
//给出编译时错误。
可为空的_stringVar;
可为空的_objVar;
编译代码时,编译器给出以下错误消息:
//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”必须是不可为null的值类型,才能将其用作泛型类型或方法“System.nullable”中的参数“T”
//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;
我读了好几遍,但还是不明白。有人能澄清这一点吗?为什么
对象
或字符串
不支持可为空的引用类型?字符串和对象是引用类型,因此已经是“可为空的”。Nullable
类型作为包装器存在于不支持null
开箱即用的值类型周围
//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 myString = null //fine
int myInt = null //compiler error
object
和string
是引用类型,因此它们已经可以为空。例如,这已经是有效的:
//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 x = null;
泛型类型仅适用于T
为不可空值类型的情况
//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;
在Nullable
的声明中,对T
有一个约束:
//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;
public struct Nullable<T> where T : struct
public结构可为null,其中T:struct
其中T:struct正是将T
约束为不可空值类型的部分。可空
定义为:
//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;
public struct Nullable<T> where T : struct
public结构可为null,其中T:struct
含义:它仅适用于值类型T
(不包括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;
您不能在引用类型(或在
Nullable
上)上使用Nullable
,但您不需要这样做,因为所有引用类型(包括object
和string
)都已经是“Nullable”,您可以将null
分配给它们。因为yiu可以直接分配null:string value=null;对象o=null;相反,您不能使用structures来处理这个问题,例如int=null;编译时出错是因为它们已经可以为null了吗<代码>字符串_stringVar=null代码>编译很好。不能将空字符串连接到example@WeylandYutani:你这是什么意思,又有什么关系?@WeylandYutani是的,你可以;结果定义得很好(就连接而言,所有null
字符串的行为都与“
相同),并且可能存在约束以确保您不会做得太疯狂。NET进行了大量优化,以确保使用Nullable不会对性能造成重大影响。毕竟,Nullable本身就是一种值类型(一种结构),但你不能对Nullable执行Nullable操作——编译器可能在C#泛型约束未涵盖的地方有一个额外的验证——仅仅使用Nullable的反编译代码就可以让你执行一个示例。MyNullable
@Luaan:不,没有“额外验证”此处:其中T:struct
已经阻止了Nullable
,因为Nullable
不是不可为空的值类型。我怀疑您的反编译版本没有包含约束。@lua在“额外验证”中专门针对Nullable
情况-其中t:struct明确有关于此的规则,这不适用于MyNullable
/MyNullable
——但它会阻止MyNullable
。约束就在那里。签名是public struct Nullable,其中T:struct
,也就是说,它也是一个struct,因此是一个有效的值类型。我的逻辑/理解有什么问题?@Luaan:你认为其中T:struct
意味着T
只需要是一个struct。它必须是不可为空的值类型<代码>可为null不是不可为null的值类型。但是,考虑到这一点,您的MyNullable
不会被视为可空值类型,因此MyNullable
和nullable
都可以,但MyNullable
不会。
//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;