12

たとえば、2 つのクラスがあるとします。

public class A
{
    public int a;
}

public class B
{
    public int b;

    public static implicit operator B(A x)
    {
        return new B { b = x.a };
    }
}

それでなんで

A a = new A { a = 0 };
B b = a; //OK

List<A> listA = new List<A> { new A { a = 0 } };
List<B> listB = listA.Cast<B>().ToList(); //throws InvalidCastException

explicitオペレーターも同様。

PS: 各要素を手動で (個別に) キャストすると機能します

List<B> listB = listA.Select<A, B>(s => s).ToList(); //OK
4

1 に答える 1

10

の名前はEnumerable.Cast、その目的が値のボックス化を解除することであるため、誤解を招く可能性があります。を生成するためにIEnumerable(上ではなく)動作します。すでに を持っている場合は、使用したい方法ではない可能性が高いです。IEnumerable<T>IEnumerable<T>IEnumerable<T> Enumerable.Cast

技術的には、次のようなことをしています。

foreach(object obj in value)
    yield return (T)obj;

Tがボックス化された値以外の場合、InvalidCastException.

この動作を自分でテストできます。

int i = 0;
object o = i;
double d1 = (double)i; // Works.
double d2 = (double)o; // Throws InvalidCastException

考えられる解決策は 2 つあります。

  1. 使用するSelect(x => (B)x)
  2. ではなく でCast動作する拡張メソッドを作成します。IEnumerable<T>IEnumerable
于 2012-09-17T07:54:18.880 に答える