Примечание. Я использую ссылочные типы C # 8, допускающие значение NULL. Типы ссылок по умолчанию НЕ допускают значения NULL.
Предположим, у меня есть следующий метод:
public void TestMethod<T>(T[] items)
{
}
Без использования каких-либо общих ограничений, как я могу использовать атрибуты Nullable, чтобы указать, что сам массив не будет иметь значение NULL, но отдельный элемент в массиве может иметь значение NULL?
Моя цель следующая:
- Нет предупреждения, поскольку сам массив не равен нулю:
var len = items.Length;
- Предупреждение, потому что отдельный элемент может быть пустым:
items[0].ToString()
- Без предупреждения из-за оператора объединения null:
items[0]?.ToString()
Этот код, кажется, указывает на то, что сам массив может быть нулевым, но, если сам массив не является нулевым, то каждый элемент массива также не является нулевым:
public void TestMethod<T>([MaybeNull]T[] items)
{
}
Я знаю, что использование общих ограничений решит эту проблему, потому что тогда я мог бы использовать T?[] items
, но тогда мне нужно создать две версии класса - одну для типов значений и одну для ссылочных типов. Есть ли способ указать это без использования общих ограничений?
C# 8
нет способа выразить, что типT
(или элементы массиваT[]
) может быть одновременноnullable reference type
илиnullable value type
без использования ограничений типаT : class
иT : struct
. Вот примечания к собранию разработчиков языка по этой проблеме: github.com/dotnet/csharplang/blob/master/meetings/2020/. Ранее команда разработчиков рассмотрелаT??
синтаксис для этой проблемы (github.com/dotnet/csharplang/blob/master/meetings/2019/). Но с этим синтаксисом возникли некоторые проблемы. А теперь рассматривает другие решения. - person Iliar Turdushev   schedule 06.07.2020where T : default
будет добавлен в C # 9 - person Pavel Anikhouski   schedule 06.07.2020T?
. И, если это то, к чему я стремился, тогда[MaybeNull]
было бы уместно. Проблема в том, что я ищуT?[]
.[MaybeNull]T[]
означает то же, что иT[]?
- мне нужноT?[]
. - person Mike Christiansen   schedule 06.07.2020