Уточнение возможного предупреждения о нулевой ссылке - PullRequest
3 голосов
/ 25 марта 2011

Resharper выдает предупреждение о нулевой ссылке для приведенного здесь.Есть ли вероятность того, что это действительно произойдет, или проверка в операторе if исключает это?

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

Ответы [ 4 ]

8 голосов
/ 25 марта 2011

Редактировать: Ой, я все здесь ошибся - вот правильный ответ:

Оператор is проверяет совместимость типов и , так что ReSharper долженне предупреждать в данном конкретном случае.

Доказательство :

using System;

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

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

Дополнительные доказательства:

есть (Справочник по C #) :

Выражение is оценивается как true , если предоставленное выражение ненулевое , и предоставленный объект может быть приведенк предоставленному типу, не вызывая исключения.


Старый ответ: Это неверно, но для полноты я оставлю это здесь.

Да, someObject здесь все еще может быть null.

Здесь проверяется только тип переменной :

someObject is MyObjectType

Тип someObject вполне может быть MyObjectType, но нигде не может указывать.Другими словами, существует разница между типом ссылки и тем, указывает ли эта ссылка на экземпляр объекта.

4 голосов
/ 25 марта 2011

Да, проверка is исключает это.

Как оказалось, ваша проверка не защищает вас от всех случаев. Учтите следующее:

MyObjectType obj = null;
ParentType someObject = obj;

В этом случае проверка is будет успешной, но значение все равно будет null.

Обновление

Мне было любопытно, когда я написал пример выше, был ли я прав или нет. Оказывается, меня не было. Проверка выше всегда будет возвращать ложь (потому что фактическое значение равно нулю).

Вы можете сделать это немного чище и удалить предупреждение, изменив код на:

var castObject = someObject as MyObjectType;

if(castObject != null)
    castObject.SomeProperty = true;
2 голосов
/ 25 марта 2011

Я не думаю, что ReSharper будет таким умным.Но в любом случае, что я обычно вижу, это что-то вроде

MyObjectType someTypedObject = someObject as MyObjectType;
if (someTypedObject != null)
{
// use the object
}
0 голосов
/ 25 марта 2011

Мне тоже было немного любопытно по этому поводу, но я вижу, что вы почти уже ответили на вопрос.

Однако, так как я сделал это хорошее изображение для вас, я мог бы также загрузить его: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...