with property operator has check c# .net nullable string-comparison value-type

operator - nullable property c#



¿Nullable<int> es un "tipo de valor predefinido", o cómo funcionan aquí Equals() y==? (2)

En C #, hay un concepto llamado "Operadores elevados", descrito en la sección 7.3.7 de la especificación del idioma ( descarga de la versión 5 ):

Los operadores levantados permiten que los operadores predefinidos y definidos por el usuario que operan con tipos de valores que no admiten nulos también se utilicen con formas que admiten nulos de esos tipos. Los operadores elevados se construyen a partir de operadores predefinidos y definidos por el usuario que cumplen ciertos requisitos, como se describe a continuación.

Y específicamente:

Para los operadores de igualdad.

== !=

existe una forma levantada de un operador si los tipos de operandos son tipos de valores no anulables y si el tipo de resultado es bool. La forma levantada se construye agregando un solo? Modificador a cada tipo de operando. El operador elevado considera dos valores nulos iguales y un valor nulo no es igual a cualquier valor no nulo. Si ambos operandos no son nulos, el operador levantado desenvuelve los operandos y aplica el operador subyacente para producir el resultado bool.

Entonces, ya que hay un operador == definido entre int s, también hay uno definido para int? s

Para mi propia implementación de un método Equals (), quiero verificar un montón de campos internos. Lo hago así:

... _myNullableInt == obj._myNullableInt && _myString == obj._myString && ...

Supongo que esto compara los valores, incluido el valor nulo, para la igualdad, no la dirección del objeto (como lo haría una operación de comparación de comparación de equivalencias) porque:

Se dice así para "tipos de valores predefinidos" en este documento de MSDN aquí . Supongo que Nullable<int> es un "tipo de valor predefinido" porque está en el espacio de nombres del System acuerdo con este documento de MSDN .

¿Tengo razón al suponer que los valores se comparan aquí?

Nota: Las pruebas de unidad mostraron "Sí", pero quería que los demás me tranquilizaran con esta pregunta, en caso de que me perdiera algo.


Si compara esos valores, en realidad llamará al Nullable<T>.Equals , ya que ambos valores son valores nulables.

Nullable<T>.Equals eventualmente llamarán la == palabra clave de comparación de int, si ambos valores no son nulos. Así que al final, verificará los valores.

El código del método Equals muestra esto bien:

public override bool Equals(object other) { if (!this.HasValue) { return (other == null); } if (other == null) { return false; } return this.value.Equals(other); }