문제

암시 적 유형 캐스팅을 구현하려는 일반적인 클래스가 있습니다. 주로 작동하지만 인터페이스 캐스팅에는 작동하지 않습니다. 추가 조사 결과, 컴파일러 오류가 있음을 발견했습니다. "인터페이스에서 사용자 정의 변환"이 적용됩니다. 나는 이것이 어떤 경우에는 시행되어야한다는 것을 이해하지만, 내가하려는 것은 합법적 인 경우처럼 보인다.

예는 다음과 같습니다.

public class Foo<T> where T : IBar
{
    private readonly T instance;

    public Foo(T instance)
    {
        this.instance = instance;
    }
    public T Instance
    {
        get { return instance; }
    }
    public static implicit operator Foo<T>(T instance)
    {
        return new Foo<T>(instance);
    }
}

사용하는 코드 :

var concreteReferenceToBar = new ConcreteBar();
IBar intefaceReferenceToBar = concreteReferenceToBar;
Foo<ConcreteBar> concreteFooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromConcreteBar = concreteReferenceToBar;
Foo<IBar> fooFromInterfaceBar = intefaceReferenceToBar; // doesn't work

누구든지 해결 방법을 알고 있습니까? 아니면 내가 캐스팅 할 수없는 이유를 만족스러운 방식으로 설명 할 수 있습니까? interfaceReferenceToBar 암시 적으로 Foo<IBar>, 내 경우에는 전환되지 않고 Foo 안에만 포함되어 있기 때문에?

편집하다:공분산이 구원을 제공 할 수있는 것 같습니다. C# 4.0 사양이 공분산을 사용하여 인터페이스 유형을 암시 적으로 캐스팅 할 수 있기를 바랍니다.

도움이 되었습니까?

해결책

이 작업을 수행 할 수없는 이유는 C# 언어 사양에서 구체적으로 금지되어 있기 때문입니다.

클래스 또는 구조물은 소스 유형 S에서 대상 유형 T로 변환을 선언 할 수 있습니다. 다음 모든 것이 사실입니다.

  • ...
  • s도 t도 아닙니다 object 또는 인터페이스 유형.

그리고

사용자 정의 변환은 인터페이스 유형. 특히,이 제한은 인터페이스 유형, 그리고 그로 전환 인터페이스 유형 변환되는 객체가 실제로 지정된 것을 구현하는 경우에만 성공합니다. 인터페이스 유형.

원천

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top