1. ホーム
  2. c#

[解決済み] In C#, why can't a List<string> object be stored in a List<object> variable

2023-05-06 11:54:54

Question

It seems that a List object cannot be stored in a List variable in C#, and can't even be explicitly cast that way.

List<string> sl = new List<string>();
List<object> ol;
ol = sl;

results in Cannot implicitly convert type System.Collections.Generic.List<string> to System.Collections.Generic.List<object>

And then...

List<string> sl = new List<string>();
List<object> ol;
ol = (List<object>)sl;

results in Cannot convert type System.Collections.Generic.List<string> to System.Collections.Generic.List<object>

Of course, you can do it by pulling everything out of the string list and putting it back in one at a time, but it is a rather convoluted solution.

How to solved?

このように考えてみると、このようなキャストを行った後、Foo 型のオブジェクトをリストに追加すると、文字列のリストの一貫性がなくなります。 最初の参照を繰り返し実行すると、クラス キャストの例外が発生します。

余談ですが、逆キャストが出来るかどうかの方が重要だと思います。

List<object> ol = new List<object>();
List<string> sl;
sl = (List<string>)ol;

しばらくC#を使っていないので、それが合法かどうかはわかりませんが、その種のキャストは実際に(潜在的に)便利です。 この場合、より一般的なクラス(オブジェクト)から、一般的なものを継承したより特殊なクラス(文字列)へ移行していることになります。 この方法では、文字列のリストに追加しても、オブジェクトのリストに違反することはありません。

このようなキャストがC#で合法かどうか、誰か知っていますか、またはテストできますか?