相关疑难解决方法(0)

为什么.NET中没有IArray(T)接口?

2011年1月至6月更新:

信不信由你,我继续把这个界面整合到我开始的开源库中,Tao.NET.我写了一篇博客文章解释这个库的IArray<T>界面,它不仅解决了我最初在这个问题中提出的问题(一年前?!),而且还提供了协变索引界面,这在BCL中非常缺乏(在我看来).


问题(简而言之):

我问为什么.NET有IList<T>,它实现ICollection<T>,因此提供的方法来修改列表(Add,Remove,等),但不提供任何在两者之间的接口,如IArray<T>提供通过索引没有任何列表修改随机访问.


编辑2010年1月21日美国东部时间下午2:22:

在以乔恩斯基特原来的答案评论(其中他质疑多久人们就必须需要任何合同,如IArray<T>),我提到KeysValues该属性SortedList<TKey, TValues>类是IList<TKey>IList<Value>分别,到乔恩回答说:

但在这种情况下,它被声明为IList,你知道只使用索引器....它并不是非常优雅,我同意 - 但它实际上并没有给我带来任何痛苦.

这是合理的,但我会回答说它不会给你带来任何痛苦,因为你只知道你做不到.但你知道的原因并不是从代码中清楚地看出来; 这是你有经验的SortedList<TKey, TValue>课程.

如果我这样做,Visual Studio不会给我任何警告:

SortedList<string, int> mySortedList = new SortedList<string, int>();

// ...

IList<string> keys = mySortedList.Keys;
keys.Add("newkey");
Run Code Online (Sandbox Code Playgroud)

据说这是合法的IList<string>.但我们都知道,它会导致异常.

纪尧姆也提出了一个恰当的观点:

好吧,接口并不完美,但开发人员可以在调用Add/Remove/Set之前检查IsReadOnly属性...

再次,这是合理的,但是:这不会让你觉得有点迂回吗?

假设我定义了一个接口如下:

public interface ICanWalkAndRun …
Run Code Online (Sandbox Code Playgroud)

.net collections ilist interface readonly

15
推荐指数
1
解决办法
2873
查看次数

标签 统计

.net ×1

collections ×1

ilist ×1

interface ×1

readonly ×1