Quelqu'un pourrait-il m'expliquer pourquoi les parenthèses sont nécessaires?
Because Identity()
renvoie un Foo
(pas Foo?
) et n'a donc pas la propriété Value
. Si foo
est null, la valeur null sera propagée via l'appel Identity
.
Lorsque vous mettez entre parenthèses autour d'elle, les résultats de l'expression est un Nullable<Foo>
qui fait ont une propriété Value
.
Notez également que si foo
est nulle, alors vous serez appeler Value
sur un Nullable<Foo>
qui n'a pas de valeur, et aurez une exception lors de l'exécution. Certains analyseurs statiques reconnaîtront que vous avez une exception de référence nulle possible et vous préviendront.
Si vous les étendre à leurs équivalents sans nul propagation, il sera plus clair:
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
Si Identity()
retours Foo
, pourquoi ne pas Foo foo3 = foo?.Identity();
compilez?
L'équivalent de ce serait:
Foo foo3
if(foo != null)
{
foo3 = foo.Identity();
}
else
{
foo3 = null; // not possible
}
Dans le premier cas, vous essayez d'accéder à un membre nommé '' value' dans foo', qui n'existe pas. Dans la deuxième instruction, 'Value' fait référence à une propriété de' Nullable '. –
xfx
Si vous y pensez vraiment, appeler '.Value' sur une expression qui inclut l'opérateur conditionnel nul est contradictoire (soit vous attendez une valeur nulle, soit vous ne le faites pas).Vous voudrez probablement utiliser un opérateur de coalescence nul à la place, auquel cas les parenthèses ne sont pas nécessaires. Par exemple: 'Foo foo2 = foo? .Identity() ?? '; –
sstan