2016-03-13 5 views
6

Ich muss etwas vermissen und fühle mich wie ich zurück zu den Grundlagen, aber according to the reference sources für ConcurrentDictionary in. Net 4.5 es implementiert die IReadOnlyDictionary-Schnittstelle (wenn auch einige Mitglieder explizit), aber aus irgendeinem Grund kann ich keine Instanz darauf werfen Schnittstelle - warum ist das?Konnte nicht konvertiert werden. Net ConcurrentDictionary <K,V> zu IReadOnlyDictionary <K,V> Schnittstelle?

IDictionary<int, string> a = new ConcurrentDictionary<int, string>(); // works 
IReadOnlyDictionary<int, string> b = new ConcurrentDictionary<int, string>(); // does not work 

.. warum ist das?

Um dies ein wenig mehr klar:

enter image description here

+0

Der Quellcode, auf den Sie verweisen, ist für .NET 4.6.1. –

+0

Yacoub - Ich weiß, aber die Schnittstelle (n) mindestens die IReadOnlyDictionary, ist in 4.5.1 (die das Projekt zielt) bereits, auch .. der Link ist nur als Referenz .. Ich könnte auch mit MSDN usw. verknüpft werden –

+0

Wenn Sie den Quelltext von .NET 4.5.1 herunterladen, werden Sie sehen, dass ConcurrentDictionary diese Schnittstelle nicht implementiert –

Antwort

7

Sie verwenden wahrscheinlich .NET-Version, wo diese Schnittstelle nicht durch die ConcurrentDictionary umgesetzt wird. Von dem, was ich versucht habe, es von .NET-Versionen vor 4.6 nicht implementiert ist:

[SerializableAttribute] 
[ComVisibleAttribute(false)] 
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
    ExternalThreading = true)] 
public class ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
    ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, 
    IDictionary, ICollection, IEnumerable 

In aktueller .NET Framework-Version (4.6.2) die ConcurrentDictionary implementiert es:

[SerializableAttribute] 
[ComVisibleAttribute(false)] 
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
    ExternalThreading = true)] 
public class ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
    ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, 
    IEnumerable, IDictionary, ICollection, IReadOnlyDictionary<TKey, TValue>, 
    IReadOnlyCollection<KeyValuePair<TKey, TValue>> 
+0

Das Projekt zielt auf 4.5.1, die auch die Schnittstelle für ConcurrentDictionary auflistet ... deshalb bin ich verwirrt . Siehe http://imgur.com/SAru0oV –

+0

@ JörgB. Hmm, vielleicht gibt es einen Fehler in der .NET Dokumentation. Aber in 4.5.1 scheint es nicht zu implementieren, während die nächste Version 4.6 es implementiert. –

6

Nun, wie es stellt sich eine Kombination von .Net 4.6 ist ein In-Place-Update und Resharper "Navigieren zu Quellen" betrog mich hier -.-

Auch wenn das Projekt Ziele 4,5 (.1), wenn zu den ConcurrentDictionary Sources (und sein offline) R # fiel auf die Dekompilierung der Assembly zurück - und da .Net 4.6 4.5 mit seinen Assemblies ersetzt, hat R # mir die falschen Assemblies "präsentiert". & Ich nahm fälschlicherweise an, dass 4.5 (.1) die IReadOnlyCollection-Schnittstelle bereits implementiert hat. Meh.

Diese In-Place-.Net-Updates sind wirklich manchmal etwas verwirrend.

Oh gut - danke Eugene/Yacoub dafür, dass ich meine Quelle (n) verdreifachen lasse.

+1

Ich hatte den gleichen Resharper zur Quelle navigieren und .NET 4.5.x Problem. Dieser Beitrag hat mir eine Menge Zeit gespart. Vielen Dank! –

Verwandte Themen