Язык программирования C#9 и платформа .NET5
Для указания способности иметь значение
в ссылочных типах, допускающихnull, применяется тот же самый символnull. Однако он не является сокращением для использования?, т.к. на местеSystem.Nullable<T>могут находиться только типы значений. Не забывайте, что обобщения и ограничения рассматриваются в главе 10.ТВключение ссылочных типов, допускающих null
Поддержка для ссылочных типов, допускающих
, управляется установкой контекста допустимости значенияnull. Это может распространяться на целый проект (за счет обновления файла проекта) или охватывать лишь несколько строк (путем применения директив компилятора). Вдобавок можно устанавливать следующие два контекста.null• Контекст с заметками о допустимости значения
включает/отключает заметки о допустимостиnull:для ссылочных типов, допускающихnull(?).null• Контекст с предупреждениями о допустимости значения
включает/отключает предупреждения компилятора для ссылочных типов, допускающихnull:.nullЧтобы увидеть их в действии, создайте новый проект консольного приложения по имени
. Откройте файл проекта (если вы используете Visual Studio, тогда дважды щелкните на имени проекта в окне Solution Explorer или щелкните правой кнопкой мыши на имени проекта и выберите в контекстном меню пункт Edit Project file (Редактировать файл проекта)). Модифицируйте содержимое файла проекта для поддержки ссылочных типов, допускающихFunWithNullableReferenceTypes, за счет добавления элементаnull(все доступные варианты представлены в табл. 4.5).<Nullable><Project Sdk="Microsoft .NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net5.0</TargetFramework><b><Nullable>enable</Nullable></b></PropertyGroup></Project>Элемент
оказывает влияние на весь проект. Для управления меньшими частями проекта используйте директиву компилятора<Nullable>, значения которой описаны в табл. 4.6.#nullableСсылочные типы, допускающие null, в действии
Во многом из-за важности изменения ошибки с типами, допускающими значение
, возникают только при их ненадлежащем применении. Добавьте в файлnullследующий класс:Program.cspublic class TestClass{public string Name { get; set; }public int Age { get; set; }}Как видите, это просто нормальный класс. Возможность принятия значения
появляется при использовании данного класса в коде. Взгляните на показанные ниже объявления:nullstring? nullableString = null;TestClass? myNullableClass = null;Настройка в файле проекта помещает весь проект в контекст допустимости значения
, который разрешает применение объявлений типовnullиstringс заметками о допустимости значенияTestClass(null). Следующая строка кода вызывает генерацию предупреждения (CS8600) из-за присваивания?типу, не допускающему значениеnull, в контексте допустимости значенияnull:null// Предупреждение CS8600 Converting null literal or possible null// value to non-nullable type// Преобразование литерала null или возможного значения null// в тип, не допускающий nullTestClass myNonNullableClass = myNullableClass;Для более точного управления тем, где в проекте находятся контексты допустимости значения
, с помощью директивы компилятораnullможно включать или отключать контекст (как обсуждалось ранее). В приведенном далее коде контекст допустимости значения#nullable(установленный на уровне проекта) сначала отключается, после чего снова включается за счет восстановления настройки из файла проекта:null#nullable disableTestClass anotherNullableClass = null;// Предупреждение CS8632 The annotation for nullable reference types// should only be used in code within a '#nullable' annotations// Заметка для ссылочных типов, допускающих значение null,// должна использоваться только в коде внутри// #nullable enable annotationsTestClass? badDefinition = null;// Предупреждение CS8632 The annotation for nullable reference types// should only be used in code within a '#nullable' annotations// Заметка для ссылочных типов, допускающих значение null,// должна использоваться только в коде внутри#nullable enable annotationsstring? anotherNullableString = null;#nullable restoreВ заключение важно отметить, что ссылочные типы, допускающие значение
, не имеют свойствnullиHasValue, т.к. они предоставляютсяValue.System.Nullable<T>

