- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
当 IReadOnlyList<T>
是在 .NET 4.5 中引入的,有那么一刻我认为拼图的缺失部分终于被插入到位:一种传递真正的只读可索引接口(interface)的方法,以前我必须使用我自己的只读接口(interface)并创建包装类围绕一切。
我期望界面被放置在“自然”层次结构中,理想情况下是:
IEnumerable<T>
.GetEnumerator()
-> IReadOnlyCollection<T> : IEnumerable<T>
.Count
-> IReadOnlyList<T> : IReadOnlyCollection<T>
.Item[...]
-> IList<T> : IReadOnlyList<T>
.Add(...)
.Clear()
.Contains(...)
(etc)
但是,事实证明, IList<T>
不继承自 IReadOnlyList<T>
.
这有什么原因吗?
一些说明:
请注意 IReadOnlyList<T>
只是一个契约,它声明列表提供了一种获取列表计数并读取特定索引处的值的方法。它的命名很糟糕,因为它没有强制执行只读的实际实现。
A List<T>
工具 IEnumerable<T>
, 一个 IList<T>
继承自 IEnumerable<T>
,但这并不意味着这些类只能被枚举。
所以,如果你想将一个列表传递给一个方法,并且只允许它被索引(读取),而不是被修改,你需要将它包装在一个新的实例中。同时,您可以将其传递给接受 IEnumerable<T>
的方法。或 IList<T>
无需 包装它。这就是我发现的问题。
我也相信专有名称应该是 ICountable
对于 IReadOnlyCollection
和 IIndexable
对于 IReadOnlyList
:
IEnumerable<T>
.GetEnumerator()
-> ICountable<T> : IEnumerable<T>
.Count
-> IIndexable<T> : ICountable<T>
.Item[...]
-> IList<T> : IIndexable<T>
.Add(...)
.Clear()
.Contains(...)
(etc)
最佳答案
@w.b 放一个链接到New interfaces IReadOnlyList and IReadOnlyDictionary在包含答案的评论中:
Why did we not change the existing interfaces to extend the read-only interfaces?
It looks like a reasonable assumption that it works because the read-only interfaces are purely a subset of the read-write interfaces. Unfortunately, it is incompatible because at the metadata level every method on every interface has its own slot (which makes explicit interface implementations work).
Immo Landwerth | .NET Framework Team (BCL) | http://blogs.msdn.com/b/bclteam/
为了更清楚地解释这一点:
假设为 .NET 4.0 编写的程序包含类 MyList<T>
实现 IList<T>
.它显然无法实现 IReadOnlyList<T>
因为该接口(interface)不存在。
现在假设系统管理员安装了 .NET 4.5 并假设 .NET 4.5 生成了 IList<T>
实现 IReadOnlyList<T>
.
如果程序随后被加载,运行时将检测到 MyList<T>
声称要执行IList<T>
, 但实际上并没有实现所有的方法:它没有实现 IReadOnlyList<T>
的方法。该程序将不再有效。
C# 编译器可能能够按名称匹配方法,但运行时不会这样做。由于 .NET 4.5 应该具有向后二进制兼容性,因此无法扩展接口(interface)以实现其他接口(interface),即使这些其他接口(interface)包含所需方法的严格子集也是如此。
关于c# - 为什么 `IList<T>` 不继承自 `IReadOnlyList<T>` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35938995/
我有一个带有此 Controller 操作方法的 ASP.NET Core 3.1 项目: [HttpGet("{param1:long}", Name = "GetData")] [Produces
我试图理解为什么 C# 中有关变体和泛型的特定行为无法编译。 class Matrix where TLine : ILine { TLine[] _lines; IReadOnlyL
我需要使用 IReadOnlyList作为返回参数,因为它最符合我的需要,但正如您在下面的示例中看到的,如果它不是真正只读的,您仍然可以修改它包装的列表。 using System.Collectio
如何创建 IReadOnlyList有一些值(value)吗? 我找到了 ReadOnlyCollection 的例子这似乎将现有集合转换为 ReadOnlyCollection但这种方法没有奏效。
我将属性类型从 List 更改为至 IReadOnlyList ,但我使用的是 List.Find()方法,现在编译器给出 error CS1061: 'IReadOnlyList' does not
属性的属性是 IReadOnlyList 是什么意思但它有一个二传手?我的困惑是,如果 List 是只读的,那么为什么我们需要 setter? public IReadOnlyList Filtere
我希望能够做这样的事情来建立一个网格数据结构。 IReadOnlyList points; IReadOnlyList> triangles; 其中三角形是点列表中的索引。给定一个索引三角形 ''ti
以下三种方法是否具有等效的垃圾回收行为? #1 有点牵强,但今天的 C# 编译器是否足够聪明,可以在每次调用方法时优化#2 中的对象创建?我特别不想在方法之外提升数组初始化。 public B
我读过这个问题:IEnumerable vs IReadonlyCollection vs ReadonlyCollection for exposing a list member这个问题:Read
如果我有一个方法需要一个参数, 有一个 Count属性(property) 有一个整数索引器(只获取) 这个参数的类型应该是什么?我会选择 IList在 .NET 4.5 之前,因为没有其他可索引的集
当 IReadOnlyList是在 .NET 4.5 中引入的,有那么一刻我认为拼图的缺失部分终于被插入到位:一种传递真正的只读可索引接口(interface)的方法,以前我必须使用我自己的只读接口(
我问是因为我认为 C# 要求在类中实现所有接口(interface)。使用 ILSpy,我发现 IReadOnlyList.this[int index] 索引器实现不在类列表中。 这是经过编辑的类声
当 IReadOnlyList是在 .NET 4.5 中引入的,有那么一刻我认为拼图的缺失部分终于被插入到位:一种传递真正的只读可索引接口(interface)的方法,以前我必须使用我自己的只读接口(
我想知道当两者都ReadOnlySpan时是否有任何界面、模式或其他什么东西和 IReadOnlyList (以及更通用的接口(interface)),并且您希望避免无用的分配 . 考虑使用 IEnu
这个问题已经有答案了: FromBluetoothAddressAsync IAsyncOperation does not contain a definition for 'GetAwaiter'
我有一个方法,我想在我的解决方案中获取所有类似列表的对象。在 .NET 4.5 之前,这很简单: public static T Method(IList list) { // elided
这个问题在这里已经有了答案: Why does List implement IReadOnlyList in .NET 4.5? (7 个答案) 关闭 8 年前。 为什么 List工具 IRead
我了解到,在处理集合时,protobuf-net 需要 GetEnumerator 进行序列化,需要一个带有 Add 的类型进行反序列化。 对于没有Add 的类型,您可以设置在反序列化之前执行的继承类
为什么List实现IReadOnlyList在.NET 4.5 中? List不是只读的... 最佳答案 因为List实现所有必要的方法/属性/等。 (然后是一些)IReadOnlyList 。接口(
我是一名优秀的程序员,十分优秀!