暗黙的な型キャストを実装しようとしているジェネリック クラスがあります。ほとんどの場合は機能しますが、インターフェースのキャストでは機能しません。さらに調査したところ、適用される「インターフェイスからのユーザー定義の変換」というコンパイラ エラーがあることがわかりました。場合によってはこれを強制する必要があることは理解していますが、私がやろうとしていることは正当なケースのように思えます。
次に例を示します。
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 仕様で、共分散を使用したインターフェイス型の暗黙的なキャストが許可されることを期待しましょう。