2017-06-08 7 views
2

私はTreeNodeCollectionの反復処理で型推論ロジックが失敗するのはなぜですか?

このコードは罰金コンパイル、ビットは、この動作に困惑しています:

private void CheckAvailabilityOfCurrentTreeNodes() { 
    foreach(TreeNode treeNode in this.DeviceTree.Nodes) { 
     if(Object.ReferenceEquals(treeNode.Tag, _recorder.CaptureDevice)) { 
     ...  
     } 
    } 
} 

が、以下は言ってコンパイルエラーを生成し、この場合には'object' does not contain a definition for 'Tag'

private void CheckAvailabilityOfCurrentTreeNodes() { 
    foreach(var treeNode in this.DeviceTree.Nodes) { 
     if(Object.ReferenceEquals(treeNode.Tag, _recorder.CaptureDevice)) { 
     ...  
     } 
    } 
} 

、タイプ推論ロジックは、イテレータの結果タイプとしてObjectを返しますが、なぜTreeNodeCollectionが厳密に型指定されているのか、なぜわかりませんか。このコレクションタイプはかなり日付がついていますか?

誰かがこの動作の技術的な理由について私に教えてもらえますか?

答えて

4

TreeNodeCollectionがここ

強く型付けされているので、はTreeNodeCollectionクラスの定義です:

public class TreeNodeCollection : IList, ICollection, IEnumerable 

あなたが見ることができるようにそれが実装しているため、それは強く型付けされていないですIEnumerable<TreeNode>ではなく汎用的でないIEnumerableインターフェイスです。したがって、型推論が機能し、IEnumerable.Currentの推論型はobjectです。

これは、基本的にすべてのWinFormsコレクションに適用されます。ほとんどは強く型付けされたインデクサを提供しますが、それらはすべて非汎用のIEnumerableインターフェイスを実装します。

なぜですか?それらはその時に生成されたのでジェネリック(従ってIEnumerable<T>インターフェイス)は存在しませんでした。単に更新されることはありません。

+1

確かに、コレクションの強く型付けされた「ファサード」は、それが何とか強く型付けされたと私に信じさせました。洞察に感謝します! – BlueStrat

関連する問題