質問

暗黙的な型キャストを実装しようとしているジェネリッククラスがあります。ほとんどの場合機能しますが、インターフェイスのキャストには機能しません。さらに調査すると、コンパイラエラーがあることがわかりました。<!> quot;インターフェイスからのユーザー定義の変換<!> quot;それが適用されます。場合によってはこれを実施する必要があることは理解していますが、私がやろうとしていることは正当なケースのようです。

例を次に示します。

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>をキャストできない理由を満足できる方法で説明できる人はいますか?

編集: 共分散が救いを提供するように見えます。 C#4.0仕様で、共分散を使用したインターフェイスタイプの暗黙的なキャストが許可されることを期待しましょう。

役に立ちましたか?

解決

これを実行できない理由は、C#言語仕様で特に禁止されているためです。

  

クラスまたは構造体は   ソースからの変換を宣言する   タイプSからターゲットタイプTへ   次のいずれかに該当します:

     
      
  • ...
  •   
  • SもTもobjectまたは interface-type ではありません。
  •   

and

  

ユーザー定義の変換は   からへの変換を許可   インターフェイスタイプ。特に、これ   制限により、   ユーザー定義の変換が発生します    interface-type に変換する場合、   およびへの変換    interface-type は、   実際に変換されるオブジェクト   指定されたものを実装します   インターフェイスタイプ

ソース

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top