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

Как ReSharper знает, что этот тип возврата никогда не является нулевым?

Я использую ReSharper 5.0, и мне интересно, как его функция анализа кода знает, чтобы высвечивать следующий assemblies == null с комментарием "Expression всегда false".

var directory = new DirectoryInfo("somedir");
FileInfo[] assemblies = directory.GetFiles("*.dll");

if (assemblies == null <<--- this is highlighted with "Expression is always false"
    || assemblies.Length == 0)
{
  _log.Warn("No assemblies found");
}

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

Итак - как он это знает? Я упускаю что-то очевидное или у ReSharper есть некоторые привилегированные знания, такие как внутренний список метаданных о методах структуры? Или это действительно "заставляет" внутреннее кодирование и работать?

4b9b3361

Ответ 1

Разработчики ReSharper провели анализ потоков в двоичных файлах среды .NET и определили, какие методы могут возвращать или не возвращать null. По-видимому, DirectoryInfo.GetFiles никогда не возвращает null.

Вы можете аннотировать свой собственный код, чтобы указать тот же набор правил, с набором атрибутов JetBrains.. Взгляните на сайт ReSharper: http://www.jetbrains.com/resharper/features/code_analysis.html#Annotated_Framework

Изменить:, чтобы ответить на ваш вопрос конкретно: "У ReSharper есть некоторые привилегированные знания, такие как внутренний список метаданных о методах каркаса" - да, это произошло от "интроспекции внутреннего кода и работы это"

Ответ 2

Как указывает Tim, мы аннотируем .NET Framework. Это похоже на то, что вы получаете с Code Contracts, но сделано немного по-другому. Если вы посмотрите под папкой bin в установке ReSharper, вы можете увидеть все аннотации.