Duplicar posible:
C# okay with comparing value types to nullestructuras Comparando a NULL
yo estaba trabajando en una aplicación de Windows en un entorno multiproceso y me veces obtener la excepción "invocar o BeginInvoke no puede ser llamado en un control hasta que se haya creado el identificador de ventana ". Así que pensé que simplemente agregaría esta línea de código:
if(this.Handle != null)
{
//BeginInvokeCode
}
Pero eso no solucionó el problema. Así que profundicé un poco más y me di cuenta de que IntPtr (el tipo que es Form.Handle) es una estructura que no puede ser anulada. Esta fue la solución que funcionó:
if(this.Handle != IntPtr.Zero)
{
//BeginInvokeCode
}
Entonces me di cuenta, ¿por qué incluso compilar cuando me marchaba por nula? Así que decidí probar en mi misma:
public struct Foo { }
y luego:
static void Main(string[] args)
{
Foo f = new Foo();
if (f == null) { }
}
y lo suficientemente seguro de que no recogió diciendo que "un error del operador 1 '==' no se puede aplicar a operandos de tipo 'ConsoleApplication1.Foo' y '' ". Bien, entonces comencé a buscar los metadatos para IntPtr y comencé a agregar todo a mi estructura Foo que estaba allí en la estructura IntPtr (ISerializable, ComVisible) pero nada ayudó. ! Por último, cuando he añadido la sobrecarga de operadores de == y =, funcionó:
[Serializable]
[ComVisible(true)]
public struct Foo : ISerializable
{
#region ISerializable Members
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
throw new NotImplementedException();
}
#endregion
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public static bool operator ==(Foo f1, Foo f2) { return false; }
public static bool operator !=(Foo f1, Foo f2) { return false; }
}
Esto finalmente compiló:
static void Main(string[] args)
{
Foo f = new Foo();
if (f == null) { }
}
Mi pregunta es ¿por qué? ¿Por qué si anulas == y! = ¿Puedes comparar con nulo? Los parámetros para == y! = Son todavía del tipo Foo que no son nulables, entonces, ¿por qué se permite esto de repente?
+1 para una buena pregunta por cierto, y hola de su compañero de Brooklyn :) –