是否有一个实际的原因导致List <T> .IndexOf(T)没有返回可为空的int?

Jes*_*ssy 9 c# nullable list

如果找到,该方法List<T>.IndexOf()返回整个List中第一次出现的项的从零开始的索引; 否则,-1.

我看到了它之间的平行,以及我刚刚在Code Complete中阅读的内容,它告诉我"避免隐藏含义的变量".

例如:变量pageCount中的值可能表示打印的页数,除非它等于-1,在这种情况下它表示发生了错误.

好吧,我不知道意思是否是"隐藏"的,因为它的记录足够清楚,但是null似乎比-1更好地传达了我的意思,而且.HasValue读取比> -1更好的检查.据我所知,List和Nullable类型都是在C#2.0中引入的,所以我不认为重新调整的原因int与向后兼容性有关.所以,你知道是否有原因,或者这是否是某人忘记实施的东西,我们现在必须永远忍受这个错误?

rer*_*run 10

List是以2.0版本的运行时发布的,因为它是可空的T.但是List实现了IList,它存在于1.0版本的运行时,它不仅没有可空,它不支持泛型.为了满足IList接口的约定,实现者必须在失败索引上返回-1.代码完成还认为您必须满足您同意的合同,因此List.Indexof必须返回-1.


回答评论:

到具有泛型的2.0运行时,已经有数千个应用程序针对非泛型版本编写.通过支持通用接口作为非通用接口的扩展,可以最有效地迁移该代码.此外,图像必须具有相同名称和90%相同用途的类,但在几种方法的情况下完全不同的语义.


Ben*_*igt 6

System.Collections.Generic.List可能已经在.NET 2.0中引入,并且可以为空,但-1的使用早于它. ArrayList.IndexOf(),Array.IndexOf(),String.IndexOf(),SelectedIndex一个列表框,等于是List<T>很可能是因为与现有的库一致性相同.(事实上​​即使是经典的VB也有这个含义,所以它甚至早于.NET 1.0)

正如@rerun指出的那样,它不仅仅是风格的一致性,它实际上是接口合同的一部分.所以给他+1.

虽然List<T>没有必须遵循脚步ArrayList并且不必执行IList,但这样做对于已经熟悉那些的程序员来说更有用.