インターフェイスを使用する暗黙の演算子
-
02-07-2019 - |
質問
暗黙的な型キャストを実装しようとしているジェネリッククラスがあります。ほとんどの場合機能しますが、インターフェイスのキャストには機能しません。さらに調査すると、コンパイラエラーがあることがわかりました。<!> 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 は、 実際に変換されるオブジェクト 指定されたものを実装します インターフェイスタイプ。
所属していません StackOverflow