Похоже, что поведение между VS2019 Preview 1 и Preview 2 изменилось, возможно, из-за способа изменения обнуляемого контекста.Больше нет атрибута для каждой сборки или для каждого типа.Вполне возможно, что он снова изменится, конечно,
В VS2019 Preview 2 каждая часть члена, которая выражает либо обнуляемую, либо необнуляемую информацию (параметры и тип возврата), отдельно присваивается с помощью NullableAttribute
который входит в саму сборку при необходимости.Этот атрибут имеет два конструктора:
NullableAttribute(byte)
NullableAttribute(byte[])
Форма byte
используется, когда каждый аспект обнуляемости для этого параметра / возвращаемого типа одинаков.byte[]
используется, когда есть смесь обнуляемости для одного элемента, из-за обобщений или массивов.В обоих случаях 1 используется для «не обнуляемый», 2 используется для «обнуляемый».Так, например:
public class Test
{
public string? Foo(string input) { ... }
public List<string>? Bar() { ... }
}
скомпилирован в:
public class Test
{
[return:Nullable(2)]
public string Foo([Nullable(1)] string input) { ... }
[return: Nullable(new byte[] { 1, 2 })]
public List<string> Bar() { ... }
}
Это позволяет любому коду, исследующему сборку (будь то компилятор, использующий его в качестве ссылки, или другой инструмент), понятьнамерение для каждого члена.
Я написал об этом больше в сообщении в блоге , но этого должно быть достаточно, чтобы понять суть.