가능한 복제를 null로 :
C# okay with comparing value types to null비교 구조체는
나는 다중 스레드 환경에서 윈도우 응용 프로그램에서 일하고 때로는 예외 "호출 또는 BeginInvoke는 컨트롤을 호출 할 수 없습니다를 얻을 것 창 핸들을 만들 때까지. "
if(this.Handle != null)
{
//BeginInvokeCode
}
하지만 그래도 문제가 해결되지 않은 : 그래서 난 그냥이 코드 줄을 추가 거라고 생각. 그래서 조금 더 파고, IntPtr (Form.Handle이있는 타입)은 nullable이 될 수없는 구조체라는 사실을 깨달았습니다. 이것은 수정 된 문제였습니다.
if(this.Handle != IntPtr.Zero)
{
//BeginInvokeCode
}
그렇다면 왜 내가 null을 검사 할 때 컴파일 했습니까? 그래서 내가 직접 시도하기로 결정 후
public struct Foo { }
과 :
static void Main(string[] args)
{
Foo f = new Foo();
if (f == null) { }
}
하고 "오류 1 연산자 '==는'타입의 피연산자에 적용 할 수 없다는 컴파일하지 않았다 충분히 확인 'ConsoleApplication1.Foo'및 '' ". 좋아, 그럼 IntPtr에 대한 메타 데이터를보고 IntPtr 구조체 (ISerializable, ComVisible)에 있었지만 아무 것도 도움이되지 않은 Foo 구조체에 모든 것을 추가하기 시작했습니다. ! 내가 ==의 연산자 오버로딩을 추가 할 때 마지막으로하고, =, 그것은 일 :
[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 유형이며 nullable이 아니므로 이것이 왜 갑자기 허용 되었습니까?
+1 좋은 질문 btw, 그리고 동료 브루클린에서 안녕하세요 :) –