2011-08-12 42 views
3

我有幾個地方,我有一個不限於類(或結構)的泛型類型參數,並且當我嘗試比較該類型的變量與null時,Resharper強調它,抱怨說我可能會比較一個值鍵入到null(肯定有效的異議)。在比較null之前,是否有一種可接受的方法來檢查變量是否爲值類型?如何測試變量是否是C#中的值類型?

例如:

public TObject MyProperty { get; set; } 

... 
private void SomeMethod() 
{ 
    if(MyProperty == null) //Warning here 
    { 
     ... 
    } 
} 

我一直在做if(!(MyProperty is ValueType) && MyProperty) --is是有效的?它沒有擺脫警告,但這並不一定意味着什麼。

+1

順便說一句,沒有「C#.NET」這樣的東西。該語言被命名爲「C#」。 –

+2

如果最終_wanting_將Value類型與null比較,則會產生更深層次的問題。 –

+0

在這種情況下,您不需要執行檢查 - 如果MyProperty是值類型,則等於將返回false。編譯器將首先編寫代碼將MyProperty轉換爲可空的。警告仍然有效,因爲它表明你在打字時鬆懈。 –

回答

6

你想在這是一個值類型的情況下做什麼?有時我會做:

public void DoStuff<T> (T variable) 
{ 
    if(variable == default(T)) 
     ... // true if null or 0 in the case of a value type 
} 

或者:

if(typeof(T).IsValueType) 

here

+0

我喜歡'default(T)'這樣做的方式。 –

+0

如果對象是一個值類型,我想要比較返回false(基本上,這些情況下,如果對象是引用類型並且爲null,但是其餘代碼不關心)。這聽起來像編譯器會照顧到這一點 - 我不知道它是如何處理這種情況。 –

2

您可以使用反射,但它是緩慢的,應該避免:

bool isValueType = typeof(TObject).IsValueType; 

貴泛型方法真的有必要通過參考和值類型爲類型參數?

+0

你在那裏的小'錯字':) – leppie

+0

我認爲它應該是'typeof(TObject)'或'MyProperty.GetType()'。 – stakx

+0

@leppie:修好了,謝謝,你們都對了 – BrokenGlass

1

你可以只比較類型:

if (MyProperty.GetType() == typeof(...)) 
{ 

} 

你得到一個警告,因爲MyProperty沒有分配到。

+0

'MyProperty.GetType()'會拋出NullReferenceException,如果它爲空。 –

0
public static bool IsNull<T>(T t) 
{ 
    return ((Object)t == null); 
} 
相關問題