Атрибут C #, допускающий значение NULL - элементы универсального массива

Примечание. Я использую ссылочные типы 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, но тогда мне нужно создать две версии класса - одну для типов значений и одну для ссылочных типов. Есть ли способ указать это без использования общих ограничений?


person Mike Christiansen    schedule 05.07.2020    source источник
comment
Вы уже ответили на свой вопрос: а) ссылочные типы уже допускают значение NULL, б) если вам нужен общий тип, вмещающий и то, и другое, тогда общие ограничения - это то, что вам нужно :)   -  person FoggyDay    schedule 06.07.2020
comment
Я использую ссылочные типы C # 8.0, допускающие значение NULL. Это означает, что по умолчанию ссылочный тип НЕ допускает значения NULL. Однако в этом случае мне нужно сообщить пользователю метода, что конкретный элемент массива IS допускает значение NULL. Т? не работает, я должен использовать атрибуты. Я ищу подходящий атрибут, чтобы передать это пользователю и компилятору.   -  person Mike Christiansen    schedule 06.07.2020
comment
В 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.2020
comment
comment
Согласно последняя информация от LDM where T : default будет добавлен в C # 9   -  person Pavel Anikhouski    schedule 06.07.2020
comment
@PavelAnikhouski - Этот вопрос, на который вы связались, касается того, как использовать атрибуты для обозначения T?. И, если это то, к чему я стремился, тогда [MaybeNull] было бы уместно. Проблема в том, что я ищу T?[]. [MaybeNull]T[] означает то же, что и T[]? - мне нужно T?[].   -  person Mike Christiansen    schedule 06.07.2020