2017-01-02 123 views
0

我看到堆栈溢出的问题和答案C#如何检查是否

How to check if an object is nullable?

我不能把评论在上面,因为我没有超过50条意见和对象为空这就是为什么我在这里问一个问题。

if(Nullable.GetUnderlyingType(myType) !=null) 
{ 
    // It's Nullable 
} 

如果是的myType system.string

Nullable.GetUnderlyingType(myType) 

返回null

我想System.string是为空的!

+5

您是否尝试阅读答案和所有代码,而不是复制看起来相关的代码行? 'Nullable.GetUnderlyingType()'只适用于值类型。 – CodeCaster

+1

一个对象总是可以为空的,因为它是一个参考值 –

回答

2

致电Nullable.GetUnderlyingType()不会返回任何有意义的typeof(string)。所述documentation提到:

返回指定空类型的基本类型参​​数。

返回值

的nullableType参数,如果nullableType参数是一个封闭的通用空类型的类型参数;否则为空。

换句话说,它只返回有用的东西,如果你真的将它传递一个实现Nullable<T>一个类型,例如int?bool?,等等。 这里指的是“可空类型”。

您还可以看到在代码的预期用途从Marc's answer to the question you link to

static bool IsNullable<T>(T obj) 
{ 
    // ... 
    if (!type.IsValueType) return true; // ref-type 
    if (Nullable.GetUnderlyingType(type) != null) return true; // Nullable<T> 
} 
2

Nullable<T> - 是一种特殊的结构,所以System.string不是Nullable<T>System.string是一类。所有类都可以为null。 所以,

if (myType.IsClass) 
{ 
    //can be null 
} 
1

所有引用类型可设置为null,但都是Nullable<T>类型的不是,你可以检查一个类型是通过使用!myType.IsValueType

1

System.String一个引用类型(或字符串)是一个参考类型。这意味着,这种类型的实例可以是null。可以将空值添加到值类型中(如原始类型bool,int等)。

1

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值分配给本地/字段并不意味着它必然是一个有效的值。最后,这个决定是你的。