Código para ilustrar:C# operador "==": el comportamiento del compilador con diferentes estructuras
public struct MyStruct
{
public int SomeNumber;
}
public string DoSomethingWithMyStruct(MyStruct s)
{
if (s == null)
return "this can't happen";
else
return "ok";
}
private string DoSomethingWithDateTime(DateTime s)
{
if (s == null)
return "this can't happen"; // XX
else
return "ok";
}
Ahora, "DoSomethingWithStruct" falla al compilar con: "operador '==' no se puede aplicar a operandos de tipo ' MyStruct 'y' <null>
'". Esto tiene sentido, ya que no tiene sentido intentar una comparación de referencia con una estructura, que es un tipo de valor.
OTOH, "DoSomethingWithDateTime" compila, pero con la advertencia del compilador: "Código inalcanzable detectado" en la línea marcada "XX". Ahora, supongo que no hay error de compilación aquí, porque la estructura DateTime sobrecarga el operador "==". Pero, ¿cómo sabe el compilador que el código es inalcanzable? p.ej. ¿Mira dentro del código que sobrecarga el operador "=="? (Esto está usando Visual Studio 2005 en caso de que haga la diferencia).
Nota: soy más curioso que nada sobre lo anterior. Normalmente, no intento usar "==" para comparar estructuras y valores nulos.
EDITAR: Trataré de simplificar mi pregunta: ¿por qué se compila "DoSomethingWithDateTime", cuando "DoSomethingWithMyStruct" no lo hace? Ambos argumentos son estructuras.
No estoy seguro de que ese sea el motivo. 'System.Int32' no tiene un operador' '== 'explícito, y sin embargo, legalmente se puede comparar con' null' ... – Aaronaught
@Aaronaught Dije "estructuras personalizadas" ... Excluyendo las primitivas aquí , ya que tienen reglas separadas cocidas en el lenguaje mismo. –