foreachブロックのイテレータ変数として使用var
する方が、明示的な型名よりも型の安全性が高くなります。例えば
class Item {
public string Name;
}
foreach ( Item x in col ) {
Console.WriteLine(x.Name);
}
このコードは警告なしにコンパイルされ、実行時のキャストエラーを引き起こす可能性があります。これは、foreachループがとの両方IEnumerable
で機能するためIEnumerable<T>
です。前者はとして入力された値を返しobject
、C#コンパイラは内部でキャストをItem
実行します。IEnumerable
したがって、は安全ではなく、任意のタイプのオブジェクトを含めることができるため、ランタイムエラーにつながる可能性があります。
一方、次のコードは次のいずれかのみを実行します
x
が入力されてobject
いるか、名前フィールド/プロパティを持たない別のタイプであるため、コンパイルされません
- コンパイルして、列挙中にランタイムキャストエラーが発生しないことが保証されます。
'x'のタイプはobject
、の場合IEnumerable
とT
の場合になりIEnumerable<T>
ます。コンパイラーによるキャストは行われません。
foreach ( var x in col ) {
Console.WriteLine(x.Name);
}