9

暗黙的にintをIComparableにキャストできます。リストまたは配列をIEnumerableにキャストすることもできます。

しかし、なぜリストをIEnumerableに暗黙的にキャストできないのでしょうか。

これを.netFramework4.5とVisualStudio2012Ultimateでテストしました。

テストするコード:

IComparable test1;
int t1 = 5;
test1 = t1; //OK

IEnumerable<int> test2;
List<int> t2 = new List<int>();
int[] t3 = new int[] { 5, 6 };
test2 = t2; //OK
test2 = t3; //OK

TabAlignment[] test;

IEnumerable<IComparable> test3;
test3 = t2; //error Cannot implicitly convert type 'System.Collections.Generic.List<int>' to 'System.Collections.Generic.IEnumerable<System.IComparable>'. An explicit conversion exists (are you missing a cast?)
4

2 に答える 2

13

基本的に、一般的な差異は値の型には適用されません。だからあなたができる間

各値をボックス化する必要があります。

IEnumerable<IComparable> test3 = t2.Cast<IComparable>();

したがって、これはstring参照型であるため有効ですが、

List<string> strings = new List<string>();
IEnumerable<IComparable> comparables = strings;

... では同等の方法は機能せずList<int>、ボックス化する必要があります。

于 2013-02-22T16:55:26.527 に答える
2

ジェネリックのリストとよく混同されますが、基本的には一般化するとより理にかなっています。

次の設定を検討してください。

public interface IA{
}

public class A : IA{
}

var listA = new List<A>();

次の行は機能しません。

List<IA> listI = ListA;

A : IA本質的にこれは、たとえList<I> does not : List<A>- それらが完全に別のタイプであるためです。

Castメソッドを使用しても、キャストを簡単に行うことができます。

listI = ListA.Cast<IA>();

だからあなたの場合、あなたはできる

test3 = t2.Cast<IComparable>();
于 2013-02-22T16:57:31.063 に答える