Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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#_.net_Reflection_.net 2.0 - Fatal编程技术网

C# 可以分配空值吗?

C# 可以分配空值吗?,c#,.net,reflection,.net-2.0,C#,.net,Reflection,.net 2.0,可能的重复项: 如何正确识别给定类型的变量(或类成员)是否可以采用null?更具体地说,如何处理Nullable,因为它不是引用类型?或者任何其他类型,它可能定义了一些奇怪的隐式转换。 我的直觉是,唯一确定的方法是尝试{}抓住{}它,看看它是否爆炸了。。。但是可能有一些技巧。不清楚您对所讨论的类型有哪些信息 try/catch将在执行时执行一些事情,而这并不是您真正想要的 对于一个具体的类型,您应该只需要知道变量类型就可以知道。这应该是非常明显的——或者如果不是,你会遇到比不知道空性更大的问

可能的重复项:

如何正确识别给定类型的变量(或类成员)是否可以采用
null
?更具体地说,如何处理
Nullable
,因为它不是引用类型?或者任何其他类型,它可能定义了一些奇怪的隐式转换。
我的直觉是,唯一确定的方法是
尝试{}抓住{}
它,看看它是否爆炸了。。。但是可能有一些技巧。

不清楚您对所讨论的类型有哪些信息

try/catch将在执行时执行一些事情,而这并不是您真正想要的

对于一个具体的类型,您应该只需要知道变量类型就可以知道。这应该是非常明显的——或者如果不是,你会遇到比不知道空性更大的问题:)

对于泛型类型,我发现这非常有用:

if (default(T) == null)
对于
类型
引用(例如,如果您使用的是反射),您可以使用:

if (!type.IsValueType || Nullable.GetUnderlyingType(type) != null)

Nullable公开了
HasValue
属性,因此如果您想检查值类型是否为Nullable,那么只需检查它是否公开了该属性。

只有引用类型才能实际持有null引用;
Nullable
的特例是所有的语法糖;结果值实际上不是null(因为
Nullable
也是一种值类型,所以它不能保存null引用),它只是一个
Nullable
,其值为
default(T)
,值为
HasValue=false

所以这取决于你的要求

如果您试图确定类型是否符合
null
Nothing
,在VB.NET中)文本的代码内赋值,则它是:

  • 所有引用类型
  • Nullable
如果您试图确定类型是否有资格持有真正的空引用,那么

  • 所有引用类型

至于在运行时使用反射检查特定类型,检查
IsValueType
应该足以满足您的需要,即使它是前者(只需在代码中为
Nullable
添加一个特例即可)。

我喜欢
if(默认值(T)==null)
。然后我意识到我问错了问题。我应该尝试分配
default(T)
,而不是在第一步中分配
null
place@liho1eye当前位置很难知道这是否合适,因为我们不知道您的上下文是什么。如果你能举一个代码的例子,那将非常有帮助。不,不,那很好。回想起来似乎很明显。。。我不知道为什么我会专注于
null
。这取决于你所说的“null值”是什么意思。如果你只说“空引用”,那么我完全同意你的看法。然而,C#规范提到了这样的事情:“HasValue为false的实例称为null。”以及“可空类型可以表示其基础类型的所有值加上额外的null值。”因此术语“null值”在可空值类型的上下文中使用。(此外,甚至术语“可空类型”有点含糊不清-有时它用来表示“可空值类型”,有时它用来表示“可空值类型和引用类型”。我认为我们应该为这种含糊不清而责怪Eric,只是出于原则:)@Jon:好的观点;我试图澄清我的答案以反映区别,尽管在一个简短的答案中要在“空值”和“空引用”之间划清界线有点困难!
bool canBeNull = !type.IsValueType || (Nullable.GetUnderlyingType(type) != null);