me encontré mirando al código que es similar a esto:¿Por qué/Cómo me permite .Net anular un Nullable <T> que es nulo?
private double? _foo;
public double? Foo
{
get { return _foo; }
set { Baz(-value); }
}
public void Baz(double? value)
{
// Perform stuff with value, including null checks
}
Y en una prueba, que tenía la siguiente:
[Test]
public void Foo_test()
{
...
Foo = null;
...
}
que esperaba que la prueba fracasaría (tiro), desde que pensé que realmente no se puede aplicar unario menos a null
, que creí que sucedería en Foo
s setter. Sin embargo, ocurrió lo inesperado y la prueba hicieron no fallan.
probablemente podría hacer una suposición informada en cuanto a por qué sucede esto, pero pensé que sería mejor si alguien que realmente sabe lo que está pasando me pudiera iluminar.
(Y antes de que alguien señala lo obvio:. Sí, definitivamente la negación debe ser empujado hacia abajo en las entrañas de Baz
)
Editar y seguimiento
lo tanto, estoy agradecido por las aportaciones de Jon Skeet y JaredPar, quienes respondieron la parte Cómo de mi pregunta. Después de googlear encontré this blog post by Eric Lippert explaining the mathematical definition of 'lifted', lo cual tiene mucho sentido. También leo las partes relevantes de la especificación del lenguaje, que son bastante sencillas y explican la mecánica del levantamiento en C#.
Específicamente ahora sé que al principio del proceso de elevación, se realiza una comprobación nula en el operando, y si el operando es nulo, nulo será el resultado de aplicar el operador (unario menos, en mi caso). Entonces -null
es null
.
Ahora, para el "por qué" parte de la pregunta. Si defino mi propia (unario) operator -
en un class
(en la que me signo de un valor envuelta), e invocar este operador en una referencia nula, voy a conseguir un NullReferenceException
. ¿Por qué es que 'levantar' se comporta de manera diferente? Estoy realmente interesado en el razonamiento detrás de esta decisión de diseño. Definitivamente soy no me opongo a la decisión.
La negación definitivamente debe ser empujada al ... uhh ... Oh. No importa. :-P –
Actualicé la pregunta con una segunda parte: * * "Why" *. –