1

C#で共分散のようなことをしたかったのですが、ここには継承がありません。

私はこのコードを持っています:

public interface IBirthday
{
   void Dance ();
}


public class Birthday:IBirthday
{
 public void Dance()
    {}
 }


void Main()
{
  List<Birthday> l= new List<Birthday>();
  List<IBirthday> d = l; //<--- How can I accomplish that ? 
}

どうすればこの作品を作ることができますか?(反復して手動でビルドする以外に(linqまたはloop))

List<IBirthday> d = list of birthdays ? 

itateing / linqが唯一の選択肢ですか?

4

2 に答える 2

6

まったく新しいリストを作成せずににを割り当てることはできません(非表示にすることはできますが、どこかで行う必要があります)List<Birthday>List<IBirthday>

あなたがやろうとしていたことが可能であるなら、誰かがやったときに何が起こるでしょう:

public class UnBirthday : IBirthday { ... }

d.Add(new UnBirthday());

さて、List<IBirthday>なので、新しいアイテムを追加できると思います。ただし、基になるリストは実際にはList<Birthday>であり、そのリストにを追加することはできませんUnBirthday。これを許可するか、実行時にクラッシュするかを選択したため、C#は、そもそも許可しないという決定を下しました(私の意見では正しく)。

あなたがやろうとしていることである一般的な引数の共分散を利用する唯一の方法は、情報を読み取ることしかできず、情報を決して入れないものに割り当てることです。この一例はですIEnumerable<T>。すべてのシングルBirthdayはであり、ではないを与えるIBirthday方法はありません。つまり、次のように言います。IEnumerableIBirthdayBirthday

List<Birthday> l= new List<Birthday>();
IEnumerable<IBirthday> d = l;

うまく動作します。

于 2012-12-17T20:39:53.867 に答える
3

次を使用できます。

d = l.Cast<IBirthday>.ToList();
于 2012-12-17T20:32:01.893 に答える