Подтвердить что ты не робот

Как знаешь, что знаешь, "выражение всегда верно"?

Проверьте следующий код:

private void Foo(object bar)
{
   Type type = bar.GetType();

    if (type != null) // Expression is always true
    {   
    }
}

Заявки Resharper type никогда не будут null. Это очевидно для меня, потому что всегда будет тип для bar, но как это знает Resharper? Как он может знать, что результат метода никогда не будет null.

type не является структурой, поэтому это не может быть. И если метод был написан мной, то возвращаемое значение могло бы быть null (не обязательно GetType, но что-то еще).

Является ли Resharper достаточно умным, чтобы знать, что только для этого метода результат никогда не будет null? (Как и жесткий кодированный список известных методов .Net, которые никогда не вернут null)

4b9b3361

Ответ 1

JetBrains прекрасно объясняет, как ReSharper делает это в своем списке функций.

Сводка по ссылке (этот конкретный вопрос касается NotNullAttribute):

Мы проанализировали значительную долю библиотеки классов .NET Framework, а также NUnit Framework и аннотировали ее через внешние XML файлы, используя набор пользовательских атрибутов из пространства имен JetBrains.Annotations, в частности:

StringFormatMethodAttribute (for methods that take format strings as parameters)
InvokerParameterNameAttribute (for methods with string literal arguments that should match one of caller parameters)
AssertionMethodAttribute (for assertion methods)
AssertionConditionAttribute (for condition parameters of assertion methods)
TerminatesProgramAttribute (for methods that terminate control flow)
CanBeNullAttribute (for values that can be null)
NotNullAttribute (for values that can not be null)
UsedImplicitlyAttribute (for entities that should not be marked as unused)
MeansImplicitUseAttribute (for extending semantics of any other attribute to mean that the corresponding entity should not be marked as unused)

Ответ 2

Да, в основном он знает некоторые известные методы. Вы должны найти то же самое для конкатенации строк, например:

string x = null;
string y = null;
string z = x + y;

if (z == null)
{
    // ReSharper should warn about this never executing
}

Теперь такая же информация также становится доступной через Code Contracts - я не знаю, подключается ли JetBrains непосредственно к этой информации, имеет свою собственную базу данных или смесь этих двух.

Ответ 3

GetType не virtual. Ваше предположение, скорее всего, будет правильным в вашем последнем заявлении.

Изменить: ответить на ваш вопрос - он не может вывести ваши методы из коробки.

Ответ 4

object.GetType не является виртуальным, поэтому вы не можете самостоятельно реализовать версию, которая возвращает нулевое значение. Следовательно, если bar равно null, вы получите NullReferenceException, и в противном случае type никогда не будет иметь значение null.