2012-09-21 2 views
5

말, 내가 가진 인터페이스인터페이스에서 클래스로 암시 적 캐스트 연산자를 정의 할 수없는 이유는 무엇입니까? 나는 C#에서 그렇게 할 수없는 이유가 아니라</p> <pre><code>public static implicit operator Control(ISomeControl ctrl) { return ctrl.MyControl; } </code></pre> <p>을 또는 :

public interface ISomeControl 
{ 
    Control MyControl { get; } 
    ... 
} 

는이 같은 떨어지게을 정의 할 수 있습니까?

+2

대답은 다음과 같습니다. 아니요 – leppie

+1

@leppie 무엇이 누락 되었습니까? 왜이 접근법이 절대적으로 잘못 되었습니까? – horgh

+0

우선 인터페이스에 구현이 없으므로 해당 연산자를 정의 할 수 없습니다. – Jamiec

답변

5

당신이 Control의 서브 클래스가 있고, 그 서브 클래스는 ISomeControl 인터페이스를 구현합니다.

class SomeControl : Control, ISomeControl {} 

이제 캐스팅이 모호합니다 (내장 된 업 캐스팅 및 사용자 정의 변환). 따라서 인터페이스에 대한 사용자 정의 변환을 제공 할 수 없습니다.

+0

그건 아주 좋은 생각이야 +1 – leppie

+0

인터페이스에서 클래스 유형으로의 변환을 허용하는 것은 모호하다. 그러나 클래스가 정의하는 경우 모호성을 볼 수 없다는 것을 이해할 수있다. 인터페이스에서 자체 변환 연산자. 'BaseType'에서'Foo' 로의 변환이 존재한다면'DerivedType' 클래스는 모호성을 만들지 않고'Foo' 로의 변환을 정의 할 수 있습니다. 클래스가 특정 인터페이스를 구현하지 않지만 하위 클래스가 구현하는 경우 해당 인터페이스에 기본 유형 참조를 캐스팅하면 참조 된 객체가 인터페이스를 구현하는지 여부에 관계없이 사용자 정의 변환을 사용해야합니다. – supercat

+0

... while 파생 클래스 참조를 사용하면 파생 클래스에 대해 정적으로 정의 된 변환을 사용해야합니다. 'Foo : ISomething '의 경우에도'ISomething '으로의 변환을 지정하면 인터페이스가 클래스에없는 "문제"가있는 것으로 보이지 않습니다. – supercat

1

당신은 그렇게 할 수 없습니다.

C#을 사양은 말한다 :

6.4.1 허용 된 사용자 정의 변환

C#을 허용 특정 사용자 정의 전환을 선언합니다. 에서는 특히 기존의 암시 적 변환을 다시 정의 할 수 없습니다. 주어진 소스 유형 S와 대상이 유형 T 인 경우 S 또는 T가 널 입력 유형 인 경우 S0 및 T0에서 기본 유형을 참조하도록합니다. 그렇지 않으면 S0 및 T0은 각각 S 및 T 과 같습니다.

  • S0와 T0 다른 종류 : 클래스 또는 구조체는 다음 모두에 해당하는 경우에만 대상 유형 T에 소스 타입 S에서 변환 를 선언하는 것이 허용된다.

  • S0 또는 T0은 연산자 선언이 이루어지는 클래스 또는 구조체 유형입니다.

  • S0 또는 T0이 인터페이스 유형이 아닙니다. 사용자 정의 변환을 제외

  • , 변환은 S에서 T 또는 T에서 당신이 그것을 할 수

한 가지 방법은 정적 메서드를 가지고있다 S.

에 존재하지 않습니다.

public class Control 
    { 
     public static Control FromISomeControl(ISomeControl ctrl) 
     { 
      return ctrl.MyControl; 
     } 
    } 
+0

이것은 "왜?"를 언급하지 않습니다.게다가 그는 마이크로 소프트가 제공 한'Control' 클래스에 대해서 이야기하고 있다고 생각합니다. 그래서 당신은 그것에 추가 할 수 없습니다. –

+0

이것이 Framework Control 클래스인지 나는 모른다. 나는 그것이 단지 하나의 예라고 생각했다. – Roland

+0

'Control'은 Microsoft에서 제공하는 * 클래스 – horgh