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