簡體   English   中英

IEnumerable,.ElementAt和C#中的無符號/有符號索引?

[英]IEnumerable, .ElementAt and unsigned/signed indices in C#?

這僅僅是一種語言的好奇心,而不是問題。

IEnumerable的ElementAt()方法接受整數以獲取可枚舉集合的第N個元素。

例如

var list = new List<char>() { 'a', 'b', 'c' };
var alias = list.AsEnumerable();
int N = 0;
alias.ElementAt(N); //gets 'a'

很好,但是,為什么ElementAt()不接受無符號整數(uint)? 例如

uint N = 0;
alias.ElementAt(N); //doesn't compile 

我可以理解為什么ElementAt可以接受整數以允許使用負索引(例如,Python允許在list [-1]指向最后一個元素的地方使用負索引),所以即使使用C#的語言也可以接受使用負索引的語言沒有。

但是我不太清楚禁止無符號整數的原因,如果有什么更好的無符號整數,因為它可以保證索引不會為負(因此只需要檢查范圍的上限)。

我能想到的最好的事情是,CLR團隊決定對有符號整數進行標准化,以允許其他具有負索引的語言(例如Python)使用相同的代碼,並確保范圍在所有語言中保持一致。

有誰對.ElementAt()為何不允許無符號ints有更好的/權威的解釋?

-Marcin

真正的原因是.NET數組可以基於非零,即使C#語言不支持聲明此類數組。 您仍然可以使用Array.CreateInstance方法(Type,Int32 [],Int32 [])創建它們。 注意所創建對象的類型的特殊名稱(System.Int32 [*]),其中帶有星號。

列表是在內部使用數組實現的,因此使用不同類型的索引是不切實際的。

此外,Count屬性通常參與數組索引計算,其中部分結果可能為負。 在表達式中混合類型會很麻煩並且容易出錯。

具有無法表示負索引的類型將無助於錯誤檢測。 無論如何,將自動剪輯與unchecked操作一起使用將無法修復應用程序中的邏輯數組索引計算錯誤。

以下示例顯示了基於負數的數組操作C#:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM