- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
此代码之所以有效,是因为 Enumerator
无法修改集合:
var roList = new List<string>() { "One", "Two", "Three" };
IEnumerable<object> objEnum = roList;
如果我们尝试对 List<object>
做同样的事情, 而不是 IEnumerable<object>
,我们会得到一个编译器错误,告诉我们不能隐式转换类型 List<string>
至 List<object>
.好吧,这是有道理的,在我看来,这是微软的一个很好的决定,作为从数组中吸取的教训。
但是,我不明白的是,为什么这个强硬规则适用于 ReadOnlyCollection
之类的东西? ?我们将无法修改 ReadOnlyCollection
中的元素,那么导致 Microsoft 阻止我们对只读内容使用协变的安全问题是什么?是否有一种可能的方法来修改 Microsoft 试图解释的那种类型的集合,例如通过指针?
最佳答案
变体和逆变仅适用于接口(interface)和委托(delegate),不适用于类。
但是,您可以这样做(使用 .NET 4.5):
ReadOnlyCollection<string> roList = ...
IReadOnlyCollection<object> objects = roList;
(因为 IReadOnlyCollection<T>
是协变的)
为了回答关于为什么类中不允许差异的问题,这里是 Jon Skeet 在他的 C# in Depth 中的解释。书(第二版,§13.3.5,第 394 页)。
NO VARIANCE FOR TYPE PARAMETERS IN CLASSES
Only interfaces and delegates can have variant type parameters. Even if you have a class that only uses the type parameter for input (or only uses it for output), you can’t specify the
in
orout
modifiers. For exampleComparer<T>
, the common implementation ofIComparer<T>
, is invariant — there’s no conversion fromComparer<IShape>
toComparer<Circle>
.Aside from any implementation difficulties that this might’ve incurred, I’d say it makes a certain amount of sense conceptually. Interfaces represent a way of looking at an object from a particular perspective, whereas classes are more rooted in the object’s actual type. This argument is weakened somewhat by inheritance letting you treat an object as an instance of any of the classes in it s inheritance hierarchy, admittedly. Either way, the CLR doesn’t allow it.
关于c# - 为什么 ReadOnlyCollection 不允许协方差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25575873/
我不知道这是否可行,但基本上,我想公开一个 ReadOnlyCollection> 类型的属性,同时仍然能够在公开属性的类中修改基础集合。此外,我希望我的类的用户能够持有对返回集合的引用,以便它在我在
ReadOnlyCollection只支持读操作。为什么 T未标有 out关键字? 最佳答案 ReadOnlyCollection supports only reading operations 它
我想知道是否有人能指出我正确的方向...... 我如何从 ReadOnlyCollection 转换至 ReadOnlyCollection没有迭代或“更新”副本? 我正在使用 .NET Framew
这个问题在这里已经有了答案: Do not nest generic types in member signatures (1 个回答) 关闭 6 年前。 我正在修改我的所有代码以符合 FxCop
我有一个包含集合( Collection myItems )的类。我希望能够私下修改此 Collection 并通过公共(public)属性将其作为只读返回(如果可能,在 O(1) 中)。我正在考虑使
有这个代码... var b = new ReadOnlyCollection(new[] { 2, 4, 2, 2 }); b[2] = 3; 我在第二行收到编译错误。我预计会出现运行时错误,因为
我正在尝试使用 ReadOnlyCollection 使对象不可变,我希望对象的属性不可变。 public ReadOnlyCollection MyReadOnlyList { get
ReadOnlyCollection 构造函数要求您为它提供 IList。但是如果您有一些 ROC,您想要连接并生成一个新的 ROC,则 Concat 方法返回 IEnumerable。这不是传递给
在我的域对象中,我将 1:M 关系映射到 IList 属性。 为了更好的隔离,我这样设置为只读: private IList _property; public ReadOnlyCollection
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
MSDN含糊地提到: A ReadOnlyCollection)>) can support multiple readers concurrently, as long as the collect
假设一个方法看起来像这样。 Class MyClass public string ConcatenateList(ReadOnlyCollection aList) { var result =
我有一个具有 ReadOnlyCollection 的重线程应用程序,如下所示: internal static ReadOnlyCollection DistributorBackpressure4
我正在设计一些接口(interface)来使用 ReadOnlyCollection表明这些接口(interface)的使用者只能从集合中读取。 然而,所提供的集合并不是一成不变的,并且会不时发生变化
使用下面的代码我得到一个 CA2104 (DoNotDeclareReadOnlyMutableReferenceTypes) warning public readonly ReadOnlyColl
SO 上已经有几个类似的问题,但我发现没有一个真正涉及到这个特定主题,所以这里... 我的理解是,应该始终尝试通过具体类返回接口(interface)。不会深入探讨其背后的原因,已经有很多关于它的事情
此代码之所以有效,是因为 Enumerator无法修改集合: var roList = new List() { "One", "Two", "Three" }; IEnumerable objEnu
我使用 EntityFramewotk 和代码优先方法。所以,我这样描述我的模型: class Person { public long Id { get;set; } public
我有以下属性: private static Collection _loadedAssemblies = new Collection(); internal static ReadOnly
看来我做不到: private int[,] _table = new int[9, 9]; private ReadOnlyCollection _tableReadOnly = new ReadO
我是一名优秀的程序员,十分优秀!