2016-03-13 2 views
6

Должно быть, что-то мне не хватает и чувствую, что мне нужно вернуться к самым основам, но according to the reference sources для ConcurrentDictionary в .Net 4.5 он реализует интерфейс IReadOnlyDictionary (хотя некоторые члены явно), но по какой-то причине я не могу использовать экземпляр для этого интерфейс - почему?Невозможно отличить .Net ConcurrentDictionary <K,V> в IReadOnlyDictionary <K,V> интерфейс?

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

.. почему это так?

Чтобы сделать это немного более ясным:

enter image description here

+0

Исходный код, на который вы ссылаетесь, предназначен для .NET 4.6.1. –

+0

Yacoub - Я знаю, но интерфейс (ы), по крайней мере, IReadOnlyDictionary один, уже в 4.5.1 (который нацелен на проект) .. ссылка IS просто для справки .. Я мог бы также связать с MSDN и т. Д. –

+0

Если вы загрузите исходный код .NET 4.5.1, вы увидите, что ConcurrentDictionary не реализует этот интерфейс. –

ответ

7

Возможно, вы используете версию .NET, где этот интерфейс не реализованный ConcurrentDictionary. Из того, что я пробовал не реализован в .NET версиях до 4.6:

[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 

В текущей версии платформы .NET (4.6.2) ConcurrentDictionary реализует его:

[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

Проект нацелен на 4.5.1, который также отображает интерфейс для ConcurrentDictionary ... вот почему я смущен , См. Http://imgur.com/SAru0oV –

+0

@ JörgB. Хм, возможно, в документации .NET есть ошибка. Но в 4.5.1 он, похоже, не реализует его, в то время как следующая версия 4.6 реализует его. –

6

Ну как это получается из комбайна .Net 4.6, являющегося обновлением на месте, и Resharper's «Переход к источникам» обманул меня здесь.

Несмотря на то, что проект ориентирован на 4.5 (.1) при переходе на источники ConcurrentDictionary (и в автономном режиме) R # отказался от «декомпиляции» сборки - и как .Net 4.6 заменяет 4.5 в целом своими сборками, R # «представил» неправильные сборки мне & Я неправильно предположил, что 4.5 (.1) уже реализует интерфейс IReadOnlyCollection. Мех.

Эти обновления на месте .Net иногда несколько сбивают с толку.

О, хорошо, спасибо Eugene/Yacoub за то, что вы меня троично проверяли мои источники.

+1

У меня был тот же Resharper, что и проблема с исходным кодом и .NET 4.5.x. Этот пост спас мне массу времени. Благодаря! –

Смежные вопросы