C# 3 での 'var' キーワードの使用について同僚と議論した後、var による型推論の適切な使用法について人々の意見はどうなっているのか疑問に思いました。
たとえば、疑わしい状況で var をかなり怠惰に使用しました。
foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.
var のより正当な使用法は次のとおりです。
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
興味深いことに、LINQ は少し灰色の領域のようです。たとえば、次のようになります。
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
IEnumerable を実装する型になるという点で結果がどうなるかは明らかですが、新しいオブジェクトを宣言する var と同じように完全には明らかではありません。
オブジェクトへの LINQ に関してはさらに悪いことです。
var results = from item in someList
where item != 3
select item;
これは同等の foreach(var item in someList) { // ... } と同等です。
ここで、型の安全性について大きな懸念があります。たとえば、そのクエリの結果を、IEnumerable<int> と IEnumerable<double> を受け入れるオーバーロードされたメソッドに配置すると、呼び出し元が誤って間違った型を渡す可能性があります。
var
強い型付けを維持しますが、問題は、型が定義ですぐに明らかにならないことが危険かどうかです。オーバーロードが意味する場合、間違った型をメソッドに誤って渡したときにコンパイラエラーが発生しない可能性がある場合に拡大されます。