3

Resharper を入手して以来、私は可能な限りメソッド内で var を使用するのが好きです。したがって、後で別の型を渡すと、すべての int 宣言を double に変更することなく、変更がコードにカスケードされます。それが私の質問につながります。DataList から DataListItems のリストを取得しています

var daysWorked = dlResourcesAllocated.Items;

次に、返されるリストをステップスルーします

foreach (var d in daysWorked)
{
     var c = d.FindControl("ucSomethingSomething"); //Doesn't compile d has no methods
}

そして、私の d は突然、メソッドを持たないオブジェクトにキャストされます

foreach (DataListItem d in daysWorked)
{
     var c = d.FindControl("ucSomethingSomething");
}

ただし、問題なく動作します。

「var」がそれが DataListItem のコレクションであることを理解できないのはなぜですか。インテリセンスはそれを知っているようです。これについては、完全に単純なワンライナーの説明があると確信しています。スキートの男がおそらく現れて、C# を深く読むときはもっと注意を払うべきだったと指摘するでしょう...

4

3 に答える 3

9

これは、ジェネリックより前にあるため、 ではなくDataListItemCollectionのみを実装しているためです。IEnumerableIEnumerable<DataListItem>

を実装していないため、タイプを明示的に指定しない限りIEnumerable<T>、ランタイムはループで を使用Objectします。foreach

これを書くことによって:

foreach (var d in daysWorked)

コンパイラは が をdaysWorked実装していることを確認しIEnumerable、これを次のように書き換えます。

foreach (object d in daysWorked)

foreachwith IEnumerable(非ジェネリック) を使用する場合、型を明示的に指定できます。

foreach (DataListItem d in daysWorked)

これを行うと、 for からの結果が効果的にキャストIEnumerableされ、ループに適切な型が提供されます。

于 2012-09-18T16:41:53.217 に答える
1

これは、 のジェネリック コレクションではなく、 をDataList.Items返すためです。DataListItemCollectionDataListItem

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.datalistitemcollection.aspx

于 2012-09-18T16:42:13.060 に答える
0

varタイプが何であるかがはっきりしている場合にのみ使用することを強くお勧めします。あなたが考える必要があるなら、あなたはおそらくあなたが助けているよりも多くの害を引き起こしているでしょう。

Itemプロパティが返され、IEnumerableではなく、が返されるように見えますIEnumerable<DataListItem>。これは、列挙内のアイテムがタイプであることを意味しますobject

foreach (DataListItem d in daysWorked)実際には、各アイテムによって返される型からへのキャストがdaysWorked生成されDataListItemます。これが、そのコードが正しく機能する理由です。

于 2012-09-18T16:44:50.220 に答える