2012-06-09 2 views
2

이 WinMD 형식으로 출력되는 C# Metro DLL을 작성하는 중 공용 클래스 Id이 있습니다. Equals을 재정의하더라도 ==에 오버로드 할 수 없습니다.C# Windows 런타임 구성 요소에서 공용 클래스에 ==를 사용하지 않도록 개발자에게 어떻게 경고 할 수 있습니까?

그러나이 클래스는 DLL에서 내부적으로 사용되며, 필연적으로 LINQ를 사용하여 분명히 작동하지 않는 .Where(x => x.Id == Ids.House)을 작성했습니다.

가능한 한 가지 해결책은 IdInternal을 내부적으로 정의하고 ==을 덮어 쓰고 Id 안에 감쌀 수 있습니다.

그 해결책이 없다면 (나는 여러 클래스에서 일어날 것이라고 생각합니다.) 컴파일러/런타임 오류를 통해 개발자에게 경고 할 수있는 방법이 있습니까?

+0

오버로드 (오버 라이딩하지 않음) Win8 CP 하에서 VS11 베타에서'=='이 (가) 나를 위해 작동합니다. 네가 그렇게 할 수 없다고 생각하는 이유는 무엇인가? – svick

+0

죄송합니다. 그 점을 지적 해 주셔서 감사합니다. 출력 유형을 WinMD로 전환하면 프레임 워크의 제한된 하위 집합을 가져옵니다. http://msdn.microsoft.com/en-us/library/windows/apps/hh977010(v=vs.110).aspx#Operator "작동 과부하가 허용되지 않음"에 대한 오버로드를 참조하십시오. – Jedidja

답변

2

운영자 오버로드는 winmd 파일에서 지원되지 않습니다. 컴파일러가 winmd 파일에서 연산자 오버로드 사용을 차단하지 못하게하는 버그가있을 수 있지만 그 동작에 의존 할 수는 없습니다.

내부 ID와 ID가 가장 좋은 방법 일 수 있다고 생각합니다.

+0

Fair 충분히 - 나는 현재 문서에서 언급되지 않은 종류의 해결 방법이있을 수 있기를 바랐다 :) 확인을위한 감사. – Jedidja

0

아이디어가 있습니다. 당신의 ID가 Int라고 말하십시오.

새 사용자 정의 유형을 만들고 명시 적 변환을 Int 연산자에 추가 한 다음 경고와 함께 [Obsolete] 속성으로 표시하십시오.

+0

이해가 안됩니다. 그게 도움이 되니? 어쩌면 코드 샘플이 유용 할 수 있습니다. – svick

+0

구현을 시도했지만 새로운 사용자 지정 형식은 Windows 런타임에서 연산자 오버로드를 노출 할 수 없으므로 public 클래스에서 내부 형식을 래핑하는 것으로 끝납니다. 질문에서 피하려고 희망하는 것은 무엇입니까? – Jedidja

관련 문제