Как назначить ссылку на обнуляемый объект для ненулевой переменной? - PullRequest
0 голосов
/ 06 марта 2020

Я использую VS2019 и включил обнуляемую семантику проверки в настройках проекта. Я пытаюсь получить путь к исполняемому файлу, используя ассемблер, как показано ниже:

        var assembly = Assembly.GetEntryAssembly();
        if (assembly == null)
        {
            throw new Exception("cannot find exe assembly");
        }
        var location = new Uri(assembly.GetName().CodeBase);//doesn't compile.

В нем говорится, что «ассемблер» является типом [Assembly?], В то время как для Uri ctor требуется строка, ошибка компиляции:

error CS8602: Dereference of a possibly null reference.

Как исправить мой код, чтобы он компилировался? Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 06 марта 2020

Ваша проблема в том, что AssemblyName.CodeBase имеет значение NULL: он имеет тип string?.

Вам необходимо добавить дополнительный код для обработки случая, когда .CodeBase равен null (или подавить его с помощью !), например:

var codeBase = Assembly.GetEntryAssembly()?.GetName().CodeBase;
if (codeBase == null)
{
    throw new Exception("cannot find exe code base");
}
var location = new Uri(codeBase);

или

var location = new Uri(assembly.GetName().CodeBase!);

Фактическое предупреждение, которое вы получите в этом случае, не имеет ничего общего с assembly , это:

предупреждение CS8604: возможный нулевой ссылочный аргумент для параметра 'uriString' в 'Uri.Uri (string uriString)'.

Source (разверните панель «Предупреждения» в правом нижнем углу). Это говорит о том, что проблема в том, что строка передается в конструктор Uri, т.е. строка, возвращаемая из .CodeBase.

3 голосов
/ 06 марта 2020

Вы можете использовать нуль-прощающий оператор !, чтобы сообщить компилятору, что значение не может быть null здесь

var location = new Uri(assembly.GetName().CodeBase!);

или использовать нуль-слияние оператор ?? с некоторым значением по умолчанию

var location = new Uri(assembly.GetName().CodeBase ?? string.Empty);

Ошибка

CS8604: возможный нулевой ссылочный аргумент для параметра 'uriString' в 'Uri.Uri (строка uriString ) '

обычно рассматривается как предупреждение, похоже, что вы включили эту опцию в настройках проекта

...