Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么字符串或对象类型不';不支持可为空的引用类型?_C#_Nullable - Fatal编程技术网

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;