В языке программирования C# тип данных struct (структура) относится к типам, которые по умолчанию не могут быть равны null. Но порой возможность сравнения структуры с null бывает необходимой. Рассмотрим, как добиться использования struct в качестве null-совместимого типа.
Неудачная попытка использования struct и null
Создадим структуру Worker на C#, описывающую информацию о Сотруднике. Она содержит следующие поля:
- Имя (name);
- Должность (position);
- Зарплата (salary).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public struct Worker { public Worker(string _name, string _position, double _salary) : this() { name = _name; position = _position; salary = _salary; } public string name { get; set; } public string position { get; set; } public double salary { get; set; } } |
Структура имеет конструктор. Для всех полей имеются геттеры и сеттеры.
Теперь напишем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
static void Main(string[] args) { Worker w1 = null; Worker w2 = new Worker("Петров Иван Николаевич", "Программист", 25000); if (w1 == null) Console.WriteLine("w1 is null"); else Console.WriteLine("w1 is not null"); if (w2 == null) Console.WriteLine("w2 is null"); else Console.WriteLine("w2 is not null"); } |
В методе Main объявляются две структуры Worker (w1 и w2). w1 присваивается null, в w2 создаётся новый экземпляр Worker. Далее обе структуры по очереди проверяются на равенство null с помощью условного оператора if.
Попробуем выполнить данный код.
Выведутся следующие ошибки: «Не удается преобразовать значение NULL в «TestConcole.Program.Worker», так как это тип, не допускающий значения NULL» и «Оператор «==» не может применяться к операндам типа «TestConcole.Program.Worker» и «<null>».
Данные ошибки закономерны, поскольку в языке C# структура struct является типом данных, который по умолчанию не может принимать значение null. Исправим проблему.
Решение проблемы использования struct и null
В C# имеется специальная структура, которая позволяет разрешить использование значения null с теми типами, для которых это запрещено согласно спецификациям. Это структура Nullable<T> или её сокращённая запись с помощью оператора ? (знак вопроса). T — это какой-либо тип данных.
Перепишем объявления структур с помощью оператора Nullable.
1 2 3 |
Nullable<Worker> w1 = null; Nullable<Worker> w2 = new Worker("Петров Иван Николаевич", "Программист", 25000); |
Также можно применить сокращённую форму записи, используя оператор ?:
1 2 3 |
Worker? w1 = null; Worker? w2 = new Worker("Петров Иван Николаевич", "Программист", 25000); |
Выполним программу.
Теперь компиляция прошла без ошибок и программа успешно завершила работу.
Резюме
Чтобы в языке C# разрешить присвоение структуре struct значения null (а также сравнение с null и т. п.), необходимо воспользоваться оператором Nullable<T> или его сокращённым эквивалентом ?.
Поделиться в соц. сетях: