2

Java または Python から来た私は、そのような構造を作成することに慣れており、通常は「うまく機能します」。最近 C# を発見しましたが、いくつかのフラストレーションを除けば、C# を使用するのはとても楽しいものです。

そのようなフラストレーションの 1 つは、ポリモーフィズム構造 (オーバーライド、仮想など) を通じてどれだけ手を握らなければならないかということです。

これは、「ただうまくいく」方法をまだ見つけていないそのようなケースの1つです。

class Polymorphism
{
    public interface IPerson
    {
        String Name { get; set; }
    }

    public class Doctor : IPerson
    {
        public String Name { get; set; }
    }

    public class DoctorGroup
    {
        public IEnumerable<IPerson> Members
        {
            get
            {
                return DoctorMembers;
            }
        }

        public List<Doctor> DoctorMembers { get; set; }
        public DoctorGroup()
        {
            DoctorMembers = new List<Doctor>();
        }
    }
}

ここではDoctorMembersare ですIPerson。したがって、 of を要求されたときに医師のリストを返すことができるはずIEnumerableですIPerson

public IEnumerable<IPerson> Members
{
    get
    {
        return DoctorMembers;
    }
}

それでも...コンパイラは文句を言います...なぜですか?私は何が欠けていますか?意味的にはこれに問題はありません。私がこれまで扱ってきたほとんどの OOP 言語は、構文上のペプト ビスモルなしでこれを消化できます。コンパイラに明らかにするためのキーワードがありませんか?

ここでの明らかな近道は、すべての医師を LINQ に変換することですが、IPersonなぜこれが必要なのか、あるいは望ましいのか、私にはわかりません。

誰か私のランタンに火をつけてくれませんか?

4

2 に答える 2

10

このコードは、.NET 4 をターゲットとする C# 4 でコンパイルされますが、一般的な差異がない C# 3 ではコンパイルされません。

IEnumerable<Doctor>基本的に、 からへの暗黙的な変換が必要ですIEnumerable<IPerson>IEnumerable<T>.NET 4 では .NET 4 で . として宣言されているのはそのためですIEnumerable<out T>

詳細については、ジェネリック分散を参照してください。これは C# 4 以降でのみ使用できることに注意してください。

( C# 3 または .NET 3.5 を使用する必要ある場合は、CSharpie で示されているソリューションを使用できますが、理想的には、より新しいバージョンにアップグレードしてください:)

于 2012-11-04T17:13:51.437 に答える
3

これを試して:

public IEnumerable<IPerson> Members
{
    get
    {
        return DoctorMembers.Cast<IPerson>();
    }
}
于 2012-11-04T17:13:22.040 に答える