2017-01-02 100 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值分配給本地/字段並不意味着它必然是一個有效的值。最後,這個決定是你的。