2016-03-13 17 views
6

Mi manca qualcosa e mi sento come se dovessi tornare alle basi ma according to the reference sources per ConcurrentDictionary in .Net 4.5 implementa l'interfaccia IReadOnlyDictionary (anche se alcuni membri sono esplicitamente), ma per qualche motivo non posso lanciare un'istanza per quello interfaccia - perché è così?Impossibile trasmettere .Net ConcurrentDictionary <K,V> all'interfaccia IReadOnlyDictionary <K,V>?

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

.. perché?

per rendere questo un po 'più chiaro:

enter image description here

+0

Il codice sorgente a cui si fa riferimento è per .NET 4.6.1. –

+0

Yacoub - Lo so, ma l'interfaccia (o almeno quella IReadOnlyDictionary) è già in 4.5.1 (che il progetto sta prendendo di mira) già .. il link è solo per riferimento .. Potrei anche collegarmi a MSDN ecc. –

+0

Se si scarica il codice sorgente di .NET 4.5.1, si noterà che ConcurrentDictionary non implementa tale interfaccia –

risposta

7

Probabilmente utilizzare la versione di .NET in cui questa interfaccia non è implementata dal ConcurrentDictionary. Da quello che ho provato non è implementata dalle versioni .NET 4.6 prima:

[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 

Nella attuale versione di .NET framework (4.6.2) la ConcurrentDictionary implementa:

[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

Il progetto ha come destinazione 4.5.1 che elenca anche l'interfaccia per ConcurrentDictionary ... ecco perché sono confuso . Vedi http://imgur.com/SAru0oV –

+0

@ JörgB. Hmm, forse c'è un errore nella documentazione di .NET. Ma in 4.5.1 sembra non implementarlo, mentre la successiva versione 4.6 lo implementa. –

6

Beh a quanto pare una combinazione di .Net 4.6 è un aggiornamento sul posto e Resharper 'Navigate to Sources' mi ha ingannato qui -.-

Anche se il progetto ha come target 4.5 (.1), quando si naviga verso le Fonti ConcurrentDictionary (e offline) R # tornò a "decompilare" l'assembly - e come .Net 4.6 sostituisce del tutto 4,5 con i suoi assembly, R # "presenta" i gruppi errati a me & Ho erroneamente assunto 4.5 (.1) per implementare già l'interfaccia IReadOnlyCollection. Meh.

Questi aggiornamenti sul posto .Net sono talvolta un po 'di confusione.

Oh bene - grazie Eugene/Yacoub per avermi fatto controllare le mie fonti triple.

+1

Ho avuto lo stesso Resharper per navigare al problema sorgente e .NET 4.5.x. Questo post mi ha salvato un sacco di tempo. Grazie! –

Problemi correlati