2011-03-25 80 views
3

Resharper爲此處投的可能的空引用警告。它是否有可能實際發生,或者檢查if語句是否排除了它?Resharper可能的空引用警告

IMyObjectType someObject = null; //MyObjectType implements IMyObjectType 
if (someObject is MyObjectType) 
{ 
    (someObject as MyObjectType).SomePropery = true; 
} 
+0

順便說一句,它並不顯示警告*我的機器上*。 Resharper ver 5.1.3。將'someObject'作爲類字段。 – Snowbear 2011-03-25 15:16:35

+0

@ Snowbear JIM編譯器奇怪。我正在運行5.1.3000.12(與5.1.3相同?)。我想知道我的實際代碼和這個例子有什麼不同? – 2011-03-25 15:26:44

+0

@丹,是的,我也有'5.1.3000.12'。不知道是什麼原因。你目前的代碼只給出'表達總是虛假'的警告,但即使我會忽略它,我沒有任何更多的警告。 – Snowbear 2011-03-25 15:41:47

回答

8

編輯:哎呦我都錯在這裏 - 在這裏是正確的答案:

is操作檢查類型兼容性無效所以ReSharper的不應該在這種特殊情況下發出警告。

證明

using System; 

class Example 
{ 
    static void Main() 
    { 
     Example example = null; 

     // this is always "false" 
     Console.WriteLine(example is Example); 
    } 
} 

更多證明:

is (C# Reference)

An是表達式計算爲如果 所提供的表達是非空真, 並且所提供的對象可以被轉換爲 所提供的類型,而不會引起 異常被拋出。


老答案:這是不正確但完整起見,我將離開這裏。

是的,someObject仍然可以在這裏null

這隻檢查變量類型:

someObject is MyObjectType 

類型的someObject很可能是MyObjectType但也無處點。換言之,引用的類型與該引用是否指向對象的實例之間存在差異。

+0

它怎麼還是空?我無法找到一種方法來測試我可以讓someObject爲null並通過IF。 – 2011-03-25 15:06:09

+1

好吧,那是真的。我被拋出建議將修改行改爲'((MyObjectType)someObject).SomePropery = true;',但如果someObject爲null,這將無濟於事,儘管如果我進行更改,resharper認爲沒關係。 – 2011-03-25 15:07:14

+0

@Andrew:關於類型與價值的非常好的一點。 – 2011-03-25 15:07:16

4

是的,is檢查排除它。

事實證明,您的支票並不能保護您免受所有情況的影響。考慮以下幾點:

MyObjectType obj = null; 
ParentType someObject = obj; 

在這種情況下, is檢查將成功,但價值依然會 null

更新

我很好奇,當我寫上面,如果我是正確與否的例子。事實證明,我沒有。上面的檢查將始終返回false(因爲實際值爲空)。

你可以做這一點清潔劑,並通過改變你的代碼刪除警告:

var castObject = someObject as MyObjectType; 

if(castObject != null) 
    castObject.SomeProperty = true; 
+0

嗯,只是自己測試過,看起來這隻有當someObject是MyObjectType時纔是真的。在這種情況下,它是IMyObject,而MyObjectType實現IMyObject時,如果將其設置爲null,則它不會傳入if語句。 – 2011-03-25 15:13:08

+0

這是空指針的事情,因此'NullReferenceException' – 2011-03-25 15:20:15

2

我不認爲ReSharper的將是聰明的。但在任何情況下我通常看到的是沿

MyObjectType someTypedObject = someObject as MyObjectType; 
if (someTypedObject != null) 
{ 
// use the object 
} 
0

我當時也有點好奇這個線的東西,但我可以看到你很可能已經回答了這個問題。

但是,因爲我爲你做的這個良好的形象,我還不如把它上傳: enter image description here

相關問題