Könnte mir jemand erklären, warum die Klammern benötigt werden?
Da Identity()
kehrt ein Foo
(kein Foo?
) und hat somit keine Value
Eigenschaft. Wenn foo
null ist, wird der Nullwert über den Identity
-Aufruf weitergegeben.
Wenn Sie Klammern um es ausdrückte, die Ergebnisse der Ausdruck ist ein Nullable<Foo>
die tut eine Value
Eigenschaft.
Beachten Sie auch, dass, wenn foo
null ist, dann werden Sie Value
auf einem Nullable<Foo>
Aufruf sein, die keinen Wert hat, und wird eine Ausnahme zur Laufzeit bekommen. Einige statische Analysatoren erkennen, dass eine mögliche Null-Referenz-Ausnahme auf Sie wartet und Sie warnt.
Wenn man sie ohne Null-Ausbreitung auf ihre Äquivalente erweitern es klar sein wird:
Foo foo1;
if(foo != null)
{
foo1 = foo.Identity().Value; // not possible - Foo has no Value property.
}
else
{
foo1 = null; // also not possible
}
Foo foo2;
Foo? temp;
if(foo != null)
{
temp = foo.Identity();
}
else
{
temp = null; // actually a Nullable<Foo> with no value
}
foo2 = temp.Value; // legal, but will throw an exception at run-time if foo is null
Wenn Identity()
kehrt Foo
, warum Foo foo3 = foo?.Identity();
kompilieren nicht?
Die äquivalent, das wäre:
Foo foo3
if(foo != null)
{
foo3 = foo.Identity();
}
else
{
foo3 = null; // not possible
}
Im ersten Fall versuchen Sie, ein Mitglied für den Zugriff auf Namen 'Value' in 'foo', die es nicht gibt. In der zweiten Anweisung bezieht sich "Wert" auf eine Eigenschaft von "Nullable". –
xfx
Wenn Sie wirklich darüber nachdenken, ist das Aufrufen von '.Value' in einem Ausdruck, der den bedingten Null-Operator enthält, widersprüchlich (Sie erwarten entweder eine Null oder Sie nicht).Sie würden höchstwahrscheinlich stattdessen einen Null-Koaleszenzoperator verwenden, in welchem Fall die Klammern nicht benötigt werden. z.B .: 'Foo foo2 = foo? .Identität() ?? '; –
sstan