В чем преимущество, если оно есть:
List<FooBar>? fooList = FooListFactory.GetFooList();
FooBar fooBar = fooList!.Find(f => f.Name=="Bar")!;
перед:
FooBar? fooBar = fooList?.Find(f => f.Name=="Bar");
источник
Два ? заменили на два !.
Причем во 2-м случае мы явно будем извлекать Value из контейнера.
А в 1-м просто подавили предупреждение.
Здравствуйте, vaa, Вы писали:
vaa>источник
vaa>Два ? заменили на два !.
vaa>Причем во 2-м случае мы явно будем извлекать Value из контейнера.
vaa>А в 1-м просто подавили предупреждение.
Странный вопрос. В первом случае мы просто отключили анализ (поведение на 100% идентично #nullable disable), во втором анализ не отключен.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
vaa>Два ? заменили на два !.
vaa>Причем во 2-м случае мы явно будем извлекать Value из контейнера.
vaa>А в 1-м просто подавили предупреждение.
Так генерируется разный код.
SharpLab
// Оригинальный код
public void Suppress() {
string? a = "";
_ = a!.Contains("a");
}
// Результат компиляции
public void Suppress()
{
"".Contains("a");
}
// Оригинальный код
public void Check() {
string? a = "";
_ = a?.Contains("a");
}
// Результат компиляции
public void Check()
{
if ("" != null)
{
"".Contains("a");
}
}
}
Здравствуйте, VladD2, Вы писали:
VD>"!" — это не проверка, а утверждение. Аналог ассерта. Ты просто затыкаешь типизатор и он не анализируя принимает твою версию о том, что в переменной точно будет значение. Но если ты не прав, в рантайме такой код грохнет.
он грохнет в любом случае, т.к. fooList = null
хоть с ! хоть без.
проверка все равно нужна, по-моему смысла никакого вводить ! нет.
тут нет ассерта, грохнет при обращении к fooBar, а не при обращении к Find.
простое отключение предупреждений. полезно только если глобально включен Nullable.
https://devblogs.microsoft.com/dotnet/nullable-reference-types-in-csharp/
судя по всему хотели как лучше(требовать инициализации и запрет обнуления после)
без иммутабельности на всю глубину св-в объекта бесполезное занятие.