0

次のコードで型変換コンパイル エラーが発生するのはなぜですか?

私のプロジェクトには、派生した Def/View クラスのインスタンスがかなりあります。それらにはすべて、永続性、検索などのコードベースがあります。ジェネリックを使用してヘルパークラスを作成することで、この共通コードベースの保守性を実現できると考えました。

ただし、ビューを def に割り当てる行の DoSomeStuff メソッドで「型変換」コンパイル エラーが発生します。基本クラスと派生クラスのすべてに対して暗黙のキャスト変換を書くように注意しました。

Def & View クラスは、意図的にいくつかの共通クラスから派生しないことに注意してください。さらに、常に View から Def への変換のみを行い、その逆は決して行いたくないため、View クラスのみに暗黙的な変換が定義されています。

私は共分散と反分散に関する Eric Lipert の議論に従おうとしましたが、彼が例を進めるにつれ、頭の中がかなり混乱してしまいました。この問題に関するヘルプは大歓迎です。

public class BaseDef
{
    public int Id { get; set; }
}

public class DerivedDef : BaseDef
{
    public string Name { get; set; }

    public DerivedDef()
        : base()
    {

    }

    public DerivedDef(BaseDef bd)
    {
        this.Id = bd.Id;
    }
}

public class BaseView
{
    public int Id { get; set; }

    public BaseView()
    {

    }

    public BaseView(BaseDef bd)
    {
        Id = bd.Id;
    }

    public BaseDef ToBaseDef()
    {
        return new BaseDef { Id = this.Id };
    }

    public static implicit operator BaseView(BaseDef bd)
    {
        return new BaseView(bd);
    }

    public static implicit operator BaseDef(BaseView bv)
    {
        return bv.ToBaseDef();
    }
}

public class DerivedView : BaseView
{
    public string Name { get; set; }

    public DerivedView()
        : base()
    {

    }

    public DerivedView(DerivedDef dd)
        : base(dd)
    {
        Name = this.Name;
    }

    public DerivedDef ToDerivedDef()
    {
        return new DerivedDef(this)
        {
            Name = this.Name,
        };
    }
}

public class SomeHelper<Tdef, Tview>
    where Tdef : BaseDef
    where Tview : BaseView
{
    public void DoSomeStuff(Tview vm)
    {
        Tdef df = vm;   // this line give a compile error 'Cannot convert type 'Tview' to 'Tdef'
        // work with df from here on
    }
}
4

2 に答える 2