Pergunta

eu preciso de ReadOnlyDictionary.Todas as postagens me disseram que não há nenhum no .Net 4.0.Por esse motivo criei minha própria implementação.

Depois de fazer isso, o Resharper 5.1 me contou sobre uma referência ambígua a System.Collections.ObjectsModel.ReadOnlyDictionary mas o código está compilando sem erros.

Tentei usar esta implementação, mas não está acessível.Por que?

Eu escrevi o código a seguir para testar se existe um ReadOnlyDictionary em .Net 4.0:

var foo = from assembly in AppDomain.CurrentDomain.GetAssemblies()
          where assembly.FullName.Contains("mscorlib")
          from type in assembly.GetTypes()
          where type.Name.StartsWith("ReadOnly")
          select type.FullName + " " + assembly.FullName;

E o resultado surpreendente é:

System.Collections.ReadOnlyCollectionBase mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Collections.ObjectModel.ReadOnlyCollection`1 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Collections.ObjectModel.ReadOnlyDictionary`2 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Collections.ObjectModel.ReadOnlyDictionaryHelpers mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Runtime.InteropServices.WindowsRuntime.ReadOnlyArrayAttribute mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Runtime.InteropServices.WindowsRuntime.ReadOnlyDictionaryKeyCollection`2 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Runtime.InteropServices.WindowsRuntime.ReadOnlyDictionaryKeyEnumerator`2 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Runtime.InteropServices.WindowsRuntime.ReadOnlyDictionaryValueCollection`2 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Runtime.InteropServices.WindowsRuntime.ReadOnlyDictionaryValueEnumerator`2 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Security.ReadOnlyPermissionSet mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Security.ReadOnlyPermissionSetEnumerator mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Collections.ArrayList+ReadOnlyList mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Collections.ArrayList+ReadOnlyArrayList mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Existe um ReadOnlyDictionary em .Net 4.0.Usei o dotPeek 1.1 para refletir esse tipo e é público.

Por que esse tipo é inacessível?O que posso fazer para evitar a referência ambígua no Resharper 5.1 (7.1 não tem esse problema)?

Foi útil?

Solução

ReadOnlyDictionary foi introduzido no .NET 4.5.Agora, o .NET 4.5 é uma instalação "over the top", e é por isso que você o vê em sua versão do mscorlib.No entanto, se o seu projeto for direcionado ao .NET 4.0, presumivelmente o Visual Studio terá algum assembly de referência em algum lugar que informa quais tipos foram realmente no .NET 4.0.

Se você puder atualizar seu aplicativo para o .NET 4.5, essa será a solução mais simples.Em termos de correção do aviso do R# - você pode simplesmente ignorá-lo, se isso acontecer apenas em uma versão antiga.Se este for um projeto de código aberto, você pode querer documentá-lo em algum lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top