Hice algunas investigaciones sobre esto mediante el uso de diferentes métodos para asignar valores a una int nullable. Esto es lo que sucedió cuando hice varias cosas. Debería aclarar qué está pasando. Tenga en cuenta: Nullable<something>
o la abreviatura something?
es una estructura para la cual el compilador parece estar haciendo un montón de trabajo para permitirnos usar con nulo como si fuera una clase.
Como verá a continuación, SomeNullable == null
y SomeNullable.HasValue
siempre devolverán un verdadero o falso esperado. Aunque no se muestra a continuación, SomeNullable == 3
también es válido (suponiendo que SomeNullable es un int?
).
Mientras SomeNullable.Value
nos muestra un error de tiempo de ejecución si asignamos null
a SomeNullable
. Este es, de hecho, el único caso en el que los nulables podrían causarnos un problema, gracias a una combinación de operadores sobrecargados, el método object.Equals(obj)
sobrecargado y la optimización del compilador y el negocio de los monos.
Aquí es una descripción de un código corría, y lo que la producción se produce en las etiquetas:
int? val = null;
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
Ok, vamos a tratar el siguiente método de inicialización:
int? val = new int?();
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
Todo lo mismo que antes . Tenga en cuenta que la inicialización con int? val = new int?(null);
, con nulo pasado al constructor, habría producido un error de tiempo COMPIL, ya que el VALOR del objeto que admite nulos no puede contener nulos. Solo el objeto contenedor puede ser nulo.
Del mismo modo, nos encontraremos con un error de tiempo de compilación de:
int? val = new int?();
val.Value = null;
no
mencionar que val.Value
es una propiedad de sólo lectura de todos modos, lo que significa que ni siquiera podemos usar algo como:
val.Value = 3;
pero de nuevo, los operadores de conversión implícitas sobrecargados polimorfas nos permiten hacerlo:
val = 3;
No hay necesidad de preocuparse por polisomthing whatchamacallits sin embargo, siempre y cuando funcione ¿verdad? :)
le pregunté a una pregunta similar ... tengo algunas buenas respuestas: http: // stackoverflow. com/questions/633286/nullable-types-best-way-to-check-for-null-or-zero-in-c – nailitdown
* Personalmente *, usaría 'HasValue' ya que creo que las palabras tienden a ser más legibles que símbolos Sin embargo, depende de usted y de lo que se ajuste a su estilo actual. –
'.HasValue' tiene más sentido ya que denota que el tipo es de tipo' T? 'En lugar de un tipo que se puede anular como cadenas. – user3791372