.net 为什么类型推断逻辑在TreeNodeCollection上的迭代失败?
我对这种行为有点困惑 这段代码编译得很好:.net 为什么类型推断逻辑在TreeNodeCollection上的迭代失败?,.net,winforms,visual-studio-2013,type-inference,c#-5.0,.net,Winforms,Visual Studio 2013,Type Inference,C# 5.0,我对这种行为有点困惑 这段代码编译得很好: private void CheckAvailabilityOfCurrentTreeNodes() { foreach( TreeNode treeNode in this.DeviceTree.Nodes ) { if( Object.ReferenceEquals(treeNode.Tag, _recorder.CaptureDevice) ) { ... } } } 但是下面生
private void CheckAvailabilityOfCurrentTreeNodes() {
foreach( TreeNode treeNode in this.DeviceTree.Nodes ) {
if( Object.ReferenceEquals(treeNode.Tag, _recorder.CaptureDevice) ) {
...
}
}
}
但是下面生成一个编译错误,说明'object'不包含“Tag”的定义
private void CheckAvailabilityOfCurrentTreeNodes() {
foreach( var treeNode in this.DeviceTree.Nodes ) {
if( Object.ReferenceEquals(treeNode.Tag, _recorder.CaptureDevice) ) {
...
}
}
}
在本例中,类型推断逻辑返回对象
作为迭代器的结果类型,但我不清楚为什么,因为树集合
是强类型的。是因为这种收藏类型已经过时了吗
有人能告诉我这种行为的技术原因吗?
因为TreeNodeCollection
是强类型的
以下是该类的定义:
如您所见,它不是强类型的,因为它实现了非泛型的IEnumerable
接口,而不是IEnumerable
。因此,类型推断是有效的,只是从IEnumerable.Current
推断出的类型是object
这基本上适用于所有WinForms集合。尽管它们大多数都提供强类型索引器,但它们都实现了非泛型的IEnumerable
接口
为什么??因为它们是在泛型(因此IEnumerable
interface)不存在的时候创建的。而且永远不会更新。事实上,该系列的强类型“facade”让我相信它某种程度上是强类型的。谢谢你的洞察力!
public class TreeNodeCollection : IList, ICollection, IEnumerable