2

2 番目の変換が失敗する理由

InvalidCastException: タイプ 'System.Collections.Generic.List`1[System.Nullable`1[System.Boolean]]' のオブジェクトをタイプ 'System.Collections.Generic.IEnumerable`1[System.Object]' にキャストできません。
object list1 = new List<string>() { "a", "b" };
object list2 = new List<bool?>() { true, false };

IEnumerable<object> bind1 = (IEnumerable<object>)list1;
IEnumerable<object> bind2 = (IEnumerable<object>)list2;

どんなアイデアでも大歓迎です。

4

2 に答える 2

6

Nullable<T>は値の型であり、一般的な共分散は値の型には適用されません (したがって、どちらからも変換されませんIEnumerable<int>) IEnumerable<object>

差異は参照型にのみ適用されます。バリアント型パラメーターに値の型を指定すると、その型パラメーターは結果として構築される型に対して不変になります。

最も簡単な修正は、次を使用することCastです。

IEnumerable<object> bind2 = list2.Cast<object>();
于 2013-07-10T15:39:14.197 に答える
3

その理由については、Jon Skeet の回答を参照してください。

最も簡単な修正は、Enumerable.Cast<T>()拡張メソッドを使用することです。

using System.Linq;

object list1 = new List<string>() { "a", "b" };
object list2 = new List<bool?>() { true, false };

IEnumerable<object> bind1 = list1.Cast<Object>();
IEnumerable<object> bind2 = list2.Cast<Object>();
于 2013-07-10T15:39:24.320 に答える