文字列をオブジェクトにアップキャストできますが、オブジェクトのIListに文字列のIListをアップスケールできません。どうして?新しいIListにすべてのアイテムをコピーすること以外は何をすべきか?C#:Generics内でのキャストはありませんか?
static void ThisWorks()
{
IList<object> list = new List<object>();
list.Add("I can add a string since string : object");
}
static void ThisDoesNotWork()
{
// throws an invalid cast exception
IList<object> list = (IList<object>) new List<string>();
list.Add("I'm never getting here ... why?");
}
これはLSPを尊重しています。彼は、より派生した型(文字列)を* less *派生型(オブジェクト)として扱います。一般的に、これは安全であると考えられています。 –
いいえ。彼はバナナバスケットからフルーツバスケットを作ろうとしている。彼が読んでいる限り、それは安全ですが、文字列が追加されていないと状況が変わってしまいます。 –
実際には、** safe ** generic co/contravarianceをサポートするC#4.0のように、これが可能である可能性があるため、あなたの例は完全に真実ではありません。 –