Resharper爲此處投的可能的空引用警告。它是否有可能實際發生,或者檢查if語句是否排除了它?Resharper可能的空引用警告
IMyObjectType someObject = null; //MyObjectType implements IMyObjectType
if (someObject is MyObjectType)
{
(someObject as MyObjectType).SomePropery = true;
}
Resharper爲此處投的可能的空引用警告。它是否有可能實際發生,或者檢查if語句是否排除了它?Resharper可能的空引用警告
IMyObjectType someObject = null; //MyObjectType implements IMyObjectType
if (someObject is MyObjectType)
{
(someObject as MyObjectType).SomePropery = true;
}
編輯:哎呦我都錯在這裏 - 在這裏是正確的答案:
的is
操作檢查類型兼容性和無效所以ReSharper的不應該在這種特殊情況下發出警告。
證明:
using System;
class Example
{
static void Main()
{
Example example = null;
// this is always "false"
Console.WriteLine(example is Example);
}
}
更多證明:
An是表達式計算爲如果 所提供的表達是非空真, 並且所提供的對象可以被轉換爲 所提供的類型,而不會引起 異常被拋出。
老答案:這是不正確但完整起見,我將離開這裏。
是的,someObject
仍然可以在這裏null
。
這隻檢查變量類型:
someObject is MyObjectType
類型的someObject
很可能是MyObjectType
但也無處點。換言之,引用的類型與該引用是否指向對象的實例之間存在差異。
它怎麼還是空?我無法找到一種方法來測試我可以讓someObject爲null並通過IF。 – 2011-03-25 15:06:09
好吧,那是真的。我被拋出建議將修改行改爲'((MyObjectType)someObject).SomePropery = true;',但如果someObject爲null,這將無濟於事,儘管如果我進行更改,resharper認爲沒關係。 – 2011-03-25 15:07:14
@Andrew:關於類型與價值的非常好的一點。 – 2011-03-25 15:07:16
是的,is
檢查排除它。
事實證明,您的支票並不能保護您免受所有情況的影響。考慮以下幾點:
MyObjectType obj = null;
ParentType someObject = obj;
在這種情況下,
is
檢查將成功,但價值依然會
null
。
更新
我很好奇,當我寫上面,如果我是正確與否的例子。事實證明,我沒有。上面的檢查將始終返回false(因爲實際值爲空)。
你可以做這一點清潔劑,並通過改變你的代碼刪除警告:
var castObject = someObject as MyObjectType;
if(castObject != null)
castObject.SomeProperty = true;
嗯,只是自己測試過,看起來這隻有當someObject是MyObjectType時纔是真的。在這種情況下,它是IMyObject,而MyObjectType實現IMyObject時,如果將其設置爲null,則它不會傳入if語句。 – 2011-03-25 15:13:08
這是空指針的事情,因此'NullReferenceException' – 2011-03-25 15:20:15
我不認爲ReSharper的將是聰明的。但在任何情況下我通常看到的是沿
MyObjectType someTypedObject = someObject as MyObjectType;
if (someTypedObject != null)
{
// use the object
}
我當時也有點好奇這個線的東西,但我可以看到你很可能已經回答了這個問題。
但是,因爲我爲你做的這個良好的形象,我還不如把它上傳:
順便說一句,它並不顯示警告*我的機器上*。 Resharper ver 5.1.3。將'someObject'作爲類字段。 – Snowbear 2011-03-25 15:16:35
@ Snowbear JIM編譯器奇怪。我正在運行5.1.3000.12(與5.1.3相同?)。我想知道我的實際代碼和這個例子有什麼不同? – 2011-03-25 15:26:44
@丹,是的,我也有'5.1.3000.12'。不知道是什麼原因。你目前的代碼只給出'表達總是虛假'的警告,但即使我會忽略它,我沒有任何更多的警告。 – Snowbear 2011-03-25 15:41:47