0

として必要な ID 番号の CSV ファイルがありますIEnumberable<int>。AからBにできるだけ簡単に移動しようとしていたところ、次のアイデアを思いつきました。

Global.migrated = File.ReadAllText(Global.migrationList).Split(',').Cast<int>().ToList<int>();

ただし、これを実行すると、キャストが無効であると言われます。また、文字列リストを読み取って int にキャストしようとしました。

List<string> myTemp = File.ReadAllText(Global.migrationList).Split(',').ToList<string>();
Global.migrated = myTemp.Cast<int>();

しかし、これにより次のエラーが発生します。

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<int>' to 'System.Collections.List<int>.' An explicit conversion exists. Are you missing a cast?

理解できない。私がキャストしようとしているオブジェクトはIEnumerable<int>、この場合ではありません。である必要がありList<string>ます。残念ながら、キャストのしくみについて重要なことを見逃しています。

4

2 に答える 2

1

オブジェクトをキャストするのではなく、変換する必要があります。

File.ReadAllText(Global.migrationList).Split(',')
   .Select(x=> Convert.ToInt32(x)).ToList();

CLR に関する限り、文字列値が文字列であり、数値ではないという点で、キャストは変換とは異なります。キャストされるオブジェクトがfloatdecimaldoubleまたは任意の数値型である場合、キャストは正常に機能します。ただし、オブジェクトは a であるためstring、CLR にはオブジェクトをキャストする方法がありません。ただし、単に CLR 型を変換するのではなく、実際にオブジェクトを解析して新しいオブジェクトを返す に astringを変換することはできます。integer

キャストと変換は実際の使用では非常に似ていると考えるかもしれませんが、CLR とはまったく異なるものです。

于 2013-08-16T21:15:38.080 に答える
1

できないCast<int>()のと同じ理由で、列挙可能な文字列に対してはできません。 と(int)"123"の間にそのような暗黙的または明示的な変換演算子はありませstringint1

を使用Select()して、文字列要素を渡しますint.Parse()

Global.migrated = File.ReadAllText(Global.migrationList)
                      .Split(',')
                      .Select(i => int.Parse(i))
                      .ToList();

1技術的には、そのようなユーザー定義の演算子が存在する可能性があるとしても、とにかくここでは使用されません。キャストはコンパイル時に解決され、ジェネリック型は実行時に置換されるため、ユーザー定義の変換演算子はジェネリック型へのキャストまたはジェネリック型からのキャスト時に使用されません (おそらく制約が関係する場合を除きます。その場合はコンパイル時に推定されます)。しかし、私は脱線します。

于 2013-08-16T21:16:01.933 に答える