IEnumerable、.ElementAt和C#中的无符号/有符号索引?

IEnumerable、.ElementAt和C#中的无符号/有符号索引?,c#,.net,clr,ienumerable,C#,.net,Clr,Ienumerable,这只是一种语言好奇心,而不是问题 IEnumerable的ElementAt()方法接受整数以获取可枚举集合的第n个元素 比如说 var list = new List<char>() { 'a', 'b', 'c' }; var alias = list.AsEnumerable(); int N = 0; alias.ElementAt(N); //gets 'a' 我可以理解为什么ElementAt可以接受整数来允许负索引(例如Python允许负索引,其中list[-1]表示

这只是一种语言好奇心,而不是问题

IEnumerable的ElementAt()方法接受整数以获取可枚举集合的第n个元素

比如说

var list = new List<char>() { 'a', 'b', 'c' };
var alias = list.AsEnumerable();
int N = 0;
alias.ElementAt(N); //gets 'a'
我可以理解为什么ElementAt可以接受整数来允许负索引(例如Python允许负索引,其中list[-1]表示最后一个元素),因此,对于那些使用负索引的语言,即使C#不使用负索引,也应该接受负索引

但是我不太明白不允许无符号整数的原因,如果有什么原因的话,无符号整数更好,因为它保证索引不会为负(因此只需要检查范围的上限)

我能想到的最好的事情可能是CLR团队决定对有符号整数进行标准化,以允许其他具有负索引的语言(例如Python)使用相同的代码,并确保不同语言的范围一致

有人对.ElementAt()不允许未签名整数的原因有更好的/权威的解释吗


-Marcin

真正的原因是.NET数组可以是非零基的,即使C语言不支持声明这样的数组。您仍然可以使用创建它们。 请注意所创建对象类型的特殊名称(System.Int32[*]),其中带有星号

列表是在内部使用数组实现的,使用不同的类型进行索引是不切实际的

此外,Count属性通常参与数组索引计算,其中部分结果可能为负数。在表达式中混合类型既麻烦又容易出错

具有不能表示负索引的类型对错误检测没有帮助。 使用带有
未选中的
操作的自动剪裁不会修复应用程序中的逻辑数组索引计算错误

以下示例显示基于负数的数组操作C#:


无符号整数不是。谢谢。让我看到了CLS合规性。可能对任何想知道这一切的人都有用。
uint N = 0;
alias.ElementAt(N); //doesn't compile 
var negativeBasedArray = Array.CreateInstance(typeof(Int32),
    new []{2}, // array of array sizes for each dimension
    new []{-1}); // array of lower bounds for each dimension
Console.WriteLine(negativeBasedArray.GetType()); // System.Int32[*]
negativeBasedArray.SetValue(123, -1);
negativeBasedArray.SetValue(456, 0);
foreach(var i in negativeBasedArray)
{
    Console.WriteLine(i);
}
// 123
// 456
Console.WriteLine(negativeBasedArray.GetLowerBound(0)); // -1
Console.WriteLine(negativeBasedArray.GetUpperBound(0)); // 0