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);