Как использовать обнуляемые атрибуты ссылочного типа в C # 7 - PullRequest
3 голосов
/ 26 февраля 2020

У меня есть библиотека, которая распространяется в виде исходного кода, и я не могу заставить своих пользователей использовать C# версию 8.

Я все еще хочу улучшить работу пользователей, использующих C# 8 с обнуляемыми ссылочными типами.

Или другими словами: моя библиотека должна компилироваться с C# 7, но также включать в себя информацию о обнуляемых ссылочных типах.

То, что я до сих пор делал, это определение Атрибуты MaybeNull et c и мои исходные файлы начинаются с

#if (NETSTANDARD && !NETSTANDARD2_0 && !NETSTANDARD1_6) || (NETCOREAPP && !NETCOREAPP2_0 && !NETCOREAPP2_1 && NETCOREAPP2_2)
#nullable disable warnings
#endif

И я поместил атрибуты в свойства, аргументы возвращают типы et c.

[return: MaybeNull]
public string Function([AllowNull) param) ...

Это работает, но так как я не могу использовать ? и !, есть несколько вещей, которые я не нашел решения для

  • Generics, похоже, что нет способ пометить параметры типа generi c как обнуляемые с атрибутами. то есть версия атрибута public async Task<string?> Method(KeyValuePair<string, string?> data)
  • Атрибуты свойств и полей игнорируются внутри класса (но работает извне)
public class C {
    [AllowNull, MaybeNull]
    private string _field;

    [AllowNull, MaybeNull]
    public string Prop1 => _field; // CS8603, Possible null reference return

    [AllowNull, MaybeNull]
    public string Prop2 { get; set; }

    public C() { 
        // CS8618, Non-nullable property 'Prop2' is uninitialized
        // CS8618, Non-nullable field '_field' is uninitialized
    }
}
  • предупреждение для локальных string local = null; et c

nullable disable warnings решает последние 2 пункта для моих пользователей, так что это не важно, но генерики - это проблема, так как у меня много асин c методов. Есть ли способ пометить обнуляемые ссылочные типы в шаблонах без использования ??

1 Ответ

0 голосов
/ 25 апреля 2020

Вы можете скомпилировать вашу библиотеку, используя C# 8, и другие могут использовать эти двоичные файлы с C# 7 (или более ранней). Ограничивающим фактором является не язык, а структура (если они не компилируют ваш исходный код с использованием более раннего компилятора).

Аннотации NRT используют атрибуты, которые автоматически определяются в сгенерированной сборке. Обычно вы их не видите, и они совпадают по имени, а не Type, что означает, что вы можете использовать аннотации из нескольких сборок, даже если они имеют разные типы аннотаций (с одинаковыми, общеизвестными именами).

Отличается от таких атрибутов, как MaybeNull и NotNullWhen et c, которые не создаются компилятором, но также соответствуют полному имени, что означает, что вы можете определить их самостоятельно или использовать библиотеку, такую ​​как Nullable.

Все это говорит о том, что вы должны иметь возможность использовать ?, ! и избегать упомянутых вами вещей #if / #endif.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...