Хобрук: Ваш путь к мастерству в программировании

Как необязательный атрибут и ссылки, допускающие значение NULL, должны работать вместе?

Я большой поклонник ссылок C#, допускающих значение NULL, и мы включаем их во всех наших новых проектах. Недавно я просматривал PR от коллеги и обнаружил, что атрибут [Необязательный] используется рядом со ссылочным параметром без указания значения по умолчанию. Это будет означать, что мы нарушаем ограничение ссылки, допускающей значение NULL, поскольку значение по умолчанию для аргумента функции будет нулевым, даже если аргумент не помечен как допускающий значение NULL. См. приведенный ниже пример кода:

class Program
{
    internal class Data
    {
        internal int Count { get; set; } = 3;
    }

    static void Main(string[] args)
    {
        BadUse();
        GoodUse();
    }

    static void BadUse([Optional] Data data) => Console.WriteLine($"Data: ${data.Count}");

    static void BadUse2([Optional, DefaultParameterValue(null)] Data data) => Console.WriteLine($"Data: ${data.Count}");

    static void GoodUse(Data? data = null) => Console.WriteLine($"Data: ${data?.Count}");
}

Как вы можете видеть, метод BadUse выше неверен и вызовет исключение нулевой ссылки без каких-либо предупреждений или ошибок компиляции. Естественно, мы используем более удобочитаемый шаблон необязательных аргументов, как в GoodUse. Интересно, это ошибка в компиляторе С# или я что-то здесь упускаю? Я бы ожидал увидеть ошибку компиляции или хотя бы какое-то предупреждение. Обратите внимание, что когда атрибут DefaultParameterValue используется в BadUse2, мы получаем ожидаемое разыменование CS8602 возможно нулевой ссылки.

20.04.2021

  • вероятно, стоит поднять вопрос на github компилятора, чтобы получить более точный ответ github.com/dotnet/csharplang 21.04.2021
  • Отвечает ли это на ваш вопрос? Использовать необязательный атрибут DefaultParameterValue или нет? 21.04.2021
  • Это похоже на нечто дополнительное, которое они добавили к реализации Microsoft C# - не в спецификации или стандарте ECMA, или это могло быть просто следствием деталей реализации необязательных параметров. И я думаю, когда они реализовывали ссылочные типы, допускающие значение NULL, они забыли обработать этот случай (?) 21.04.2021
  • @NicholasHunter, спасибо, я просмотрел его, прежде чем спрашивать, и это помогло мне выбрать, какой синтаксис необязательных аргументов использовать (подсказка: определенно не необязательный атрибут). Однако, посмотрев на него еще раз, я попробовал атрибут DefaultParameterValue, и он отлично с ним работает. Расширю пример. 21.04.2021
  • @KeithNicholas Я создал проблему и свяжу ее, как только она будет проверена и помещена в правильное репо. 21.04.2021
  • Связанная проблема с github: github.com/dotnet/roslyn/issues/52792 22.04.2021

Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..