Nullable
是一个类型,而不是一个类型的属性。 System.String
可以为空,但它不是Nullable
,与int?
不同,它是Nullable<System.Int32>
的快捷键。 C#中的所有引用类型都可以为空(可以传递空引用),而Nullable
类型只能接受不可为空的值类型作为参数。
如果你想检查一个给定类型可以接受null
作为一个值,你可以做这样的事情:
bool CanBeNull<T>()
{
return default(T) == null;
}
当然,这已经使得假设默认值是空值,这不一定是这种情况;但它适用于两种参考类型和Nullable
值类型。如果您必须处理接受空值但不作为默认值的值类型,则必须专门添加它。没有真正的确定和简单的方法来检查给定的类型是否可以被赋值为null,而不是实际尝试赋值为空值。
事实上,什么“可以分配null”的意思是非常依赖于编译器的东西。例如,像int? someValue = null;
这样的操作实际上调用了int?
的构造函数 - 它相当于int? someValue = new int?();
。
如果你不知道在编译时的类型(所以你不能使用泛型),你可以添加一个检查给定类型是否是值类型:
if (!type.IsValueType) // Can be assigned null
确保你正确地对待类,值类型和接口。当然,只要能够将一个null
值分配给本地/字段并不意味着它必然是一个有效的值。最后,这个决定是你的。
您是否尝试阅读答案和所有代码,而不是复制看起来相关的代码行? 'Nullable.GetUnderlyingType()'只适用于值类型。 – CodeCaster
一个对象总是可以为空的,因为它是一个参考值 –