IEnumerable<object>
を使用することをお勧めします。IEnumerable
ではなく、range.Skip(2)
などのLINQ拡張メソッドが定義されています。しかし、私はIEnumerable
を使用することをお勧めします。T[]
は暗黙的にIEnumerable
に変換されます。T
が参照タイプまたは値タイプであるかどうか。後者の場合、ボクシングは含まれておらず、良好である。その結果、私はIEnumerable range = new[] { 1, 2, 3 }
を行うことができます。両方の世界のベストを組み合わせることは不可能です。とにかく、私はIEnumerable
に落ち着き、LINQメソッドを適用する必要があるときに何らかのキャストを行いました。IEnumerableからIEnumerableへのキャスト<object>
thisスレッドから、私はrange.Cast<object>()
が仕事をすることができることを知ります。しかし、私の意見では不必要なパフォーマンスオーバーヘッドが発生します。私は(IEnumerable<object>)range
のような直接コンパイル時のキャストを実行しようとしました。私のテストによると、それは参照型の型では機能しますが、値型では機能しません。何か案は?
参考になると、質問にはthisGitHub問題があります。次のように私が使用したテストコードがある:これは、基本的に最初の場所でIEnumerable<object>
よりも他には何もしません
public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source)
{
IEnumerable<TResult> enumerable = source as IEnumerable<TResult>;
if (enumerable != null)
return enumerable;
if (source == null)
throw Error.ArgumentNull("source");
return Enumerable.CastIterator<TResult>(source);
}
private static IEnumerable<TResult> CastIterator<TResult>(IEnumerable source)
{
foreach (TResult result in source)
yield return result;
}
:逆コンパイル、その拡張子後
static void Main(string[] args)
{
// IEnumerable range = new[] { 1, 2, 3 }; // won't work
IEnumerable range = new[] { "a", "b", "c" };
var range2 = (IEnumerable<object>)range;
foreach (var item in range2)
{
Console.WriteLine(item);
}
}
あなたが本当に 'IEnumerableを
@Maarten「IEnumerable」というのは、一般的なケースを扱い、さまざまな要素タイプをサポートする必要があるためです。 –
Lingxi
なぜ最初に 'IEnumerable'を使って作業するのですか?どうして 'IEnumerable range = new [] {1、2、3};'代わりに? - Btw。 'IEnumerable' *はしますか?あなたが(非ジェネリックな) 'IEnumerable'を' foreach 'すると、 'object'が得られます。一方、* generic * enumerable( 'IEnumerable ')は* not *ボックスになります。 –
Corak