61

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

次に例を示します。

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

誰かが回避策を知っていますか、または私の場合は変換されておらず、Foo にのみ含まれているため、interfaceReferenceToBar暗黙的にキャストできない理由を満足のいく方法で説明できますか?Foo<IBar>

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

4

1 に答える 1

68

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

出典: ECMA-334 セクション 15.10.4

クラスまたは構造体は、ソースの型 S からターゲットの型 T への変換を宣言することが許可されています。

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

ユーザー定義の変換は、 interface-typesとの間で変換することはできません。特に、この制限により、 interface-typeへの変換時にユーザー定義の変換が発生せず、変換されるオブジェクトが実際に指定された interface-type を実装している場合にのみ、 interface-type への変換が成功する こと保証 されます。

于 2008-09-27T12:37:48.963 に答える