2017-06-08 4 views
2

Ich bin ein bisschen mit diesem Verhalten verwirrteWarum schlägt die Typinferenzlogik mit einer Iteration über eine TreeNodeCollection fehl?

Dieser Code kompiliert fein:

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

aber die folgende erzeugt eine Kompilierung Fehlermeldung, dass '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)) { 
     ...  
     } 
    } 
} 

In diesem Fall ist der Typ -Interference-Logik gibt Object als Ergebnistyp des Iterators zurück, aber ich verstehe nicht klar warum, da TreeNodeCollection stark typisiert ist. Liegt es daran, dass dieser Sammlungstyp ziemlich alt ist?

Kann mir jemand die technischen Gründe für dieses Verhalten aufklären?

Antwort

4

seit dem TreeNodeCollection ist stark typisierte

Hier ist die Definition der TreeNodeCollection Klasse:

public class TreeNodeCollection : IList, ICollection, IEnumerable 

Wie Sie sehen können, ist es nicht stark typisiert, weil es implementiert die nicht generische IEnumerable Schnittstelle statt IEnumerable<TreeNode>. So funktioniert die Art Inferenz, nur der abgeleitete Typ von IEnumerable.Current ist object.

Dies gilt im Grunde für alle WinForms-Sammlungen. Obwohl die meisten von ihnen stark typisierte Indexer bereitstellen, implementieren sie alle die nicht-generische Schnittstelle IEnumerable.

Warum? Da sie zu der Zeit Generics (daher IEnumerable<T> Schnittstelle) erstellt wurden, existierte nicht. Und einfach nie aktualisiert werden.

+1

In der Tat, die stark typisierte 'Fassade' der Kollektion ließ mich glauben, dass sie irgendwie stark typisiert war. Danke für die Einsicht! – BlueStrat

Verwandte Themen