Возможный дубликат:
С# в порядке со сравнением типов значений с нулем
Я работал над приложением Windows в многопоточной среде и иногда получал исключение "Invoke или BeginInvoke не могут быть вызваны в элементе управления до тех пор, пока не будет создан дескриптор окна". Поэтому я решил, что просто добавлю эту строку кода:
if(this.Handle != null)
{
//BeginInvokeCode
}
Но это не решило проблему. Поэтому я немного вырыл и понял, что IntPtr (тип, который Form.Handle есть) является структурой, которая не может быть нулевой. Это было исправление, которое сработало:
if(this.Handle != IntPtr.Zero)
{
//BeginInvokeCode
}
Итак, он ударил меня, почему он даже скомпилировался, когда я проверял его на null? Поэтому я решил попробовать сам:
public struct Foo { }
а затем:
static void Main(string[] args)
{
Foo f = new Foo();
if (f == null) { }
}
и, конечно же, он не компилировал, говоря, что "Error 1 Operator '==' не может применяться к операндам типа" ConsoleApplication1.Foo "и" ". Итак, я начал изучать метаданные для IntPtr и начал добавлять все к моей структуре Foo, которая была там в структуре IntPtr (ISerializable, ComVisible), но ничего не помогло. Наконец, когда я добавил перегрузку оператора == и! =, Он работал:
[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; }
}
Это окончательно скомпилировано:
static void Main(string[] args)
{
Foo f = new Foo();
if (f == null) { }
}
Мой вопрос - почему? Почему, если вы переопределяете == и! =, Вам разрешено сравнивать с null? Параметры == и!= По-прежнему имеют тип Foo, которые не могут быть нулевыми, поэтому почему это внезапно неожиданно?