可以分配null吗?

时间:2011-03-10 15:58:49

标签: c# .net reflection .net-2.0

  

可能重复:
  How to check if an object is nullable?
  Determine if reflected property can be assigned null

如何正确识别给定类型的变量(或类成员)是否可以null?更具体地说,如何处理Nullable<T>,因为它不是引用类型?或者可能在其上定义一些怪异隐式转换的任何其他类型。 我的直觉是找到答案的唯一可靠方法是try{} catch{}它,看看它是否会爆炸......但也许有一些技巧。

4 个答案:

答案 0 :(得分:12)

目前尚不清楚您所做的有关该类型的信息。

try / catch会在执行时做事,这不是你想要的。

对于具体类型,您应该只知道变量类型就能知道。它应该是非常明显的 - 或者如果不是这样,你就会遇到更大的问题,而不是知道无效:)

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

if (default(T) == null)

对于Type引用(例如,如果您正在使用反射),您可以使用:

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

答案 1 :(得分:1)

只有引用类型实际上可以包含空引用; Nullable<T>的特殊情况都是语法糖;结果值实际上不是null(因为Nullable<T>也是一个值类型,所以它不能保存空引用),它只是一个Nullable<T>default(T)作为其值和{{ 1}}。

所以这取决于你的要求。

如果您正在尝试确定该类型是否符合HasValue = false(VB.NET中的null)文字的代码内分配,那么它是:

  • 所有参考类型
  • Nothing

如果您正在尝试确定该类型是否有资格持有真正的空引用,那么它就是

  • 所有参考类型

至于在运行时使用反射检查特定类型,检查Nullable<T>应该足以满足您的需要,即使它是前者(只需在代码中添加{{1}的特殊情况})。

答案 2 :(得分:1)

bool canBeNull = !type.IsValueType || (Nullable.GetUnderlyingType(type) != null);

答案 3 :(得分:0)

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