C# .Net 4.0 mscorlib包含ReadOnlyDictionary吗?

5
我需要一个ReadOnlyDictionary。所有帖子告诉我在.Net 4.0中没有这个类,因此我创建了自己的实现。
在这之后,Resharper 5.1提示我有一个对System.Collections.ObjectsModel.ReadOnlyDictionary的模糊引用,但代码可以编译而不出错。
我尝试使用这个实现,但无法访问。为什么?
我编写了以下代码来测试.Net 4.0中是否存在ReadOnlyDictionary:
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;

惊人的结果是:

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

在.Net 4.0中有一个ReadOnlyDictionary。我使用dotPeek 1.1反射了这个类型并且它是公共的。

为什么这个类型是不可访问的? 如何避免在Resharper 5.1中出现模糊引用(7.1没有这个问题)?

1个回答

5

ReadOnlyDictionary是在.NET 4.5中引入的。现在.NET 4.5是一种“超级”安装,这就是为什么您会在mscorlib版本中看到它的原因。但是,如果您的项目针对.NET 4.0,则可能Visual Studio有某个参考程序集,告诉它哪些类型实际上在.NET 4.0中。

如果您可以将应用程序升级到.NET 4.5,那将是最简单的解决方法。至于修复R#警告-如果它只发生在旧版本中,您可能希望忽略它。如果这是一个开源项目,您可能希望在某个地方记录它。


抱歉,我们无法升级到 .Net 4.5,因为我们正在使用 Visual Studio 2010。忽略这个问题不是一个选项,因为智能感知不起作用,没有智能感知的编码会很痛苦。 - Sebastian Schumann
@Verarind:使用Visual Studio Intellisense代替R#?或者直接使用R# 7.1,如果你说它可以的话?另外,只需给类型取一个不同的名称-事实上,考虑一下,你是否在System.Collections.ObjectModel中创建了自己的类型?那绝对是个坏主意。 - Jon Skeet
我们不能在任何计算机上免费使用Resharper 7.1。我在不同的命名空间中创建了一个ReadOnlyDictionary,但它是从.Net 4.5直接移植而来,名称相同。升级到4.5后,我想删除我的类,并且在没有任何更改(除了命名空间适应)的情况下,现有代码应该可以工作。我建议卸载.Net Framework 4.5,但我不确定这会引起哪些问题。也许安装了需要它的软件。我将重命名我的ReadOnlyDictionary。谢谢。 - Sebastian Schumann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接