Это всего лишь языковое любопытство, а не проблема.IEnumerable, .ElementAt и unsigned/signed индексы в C#?
Метод ElementAt() IEnumerable принимает целые числа, чтобы получить 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 позволяет отрицательные индексы, где список [-1] ссылается на последний элемент), так что имеет смысл иметь принимать отрицательные индексы для этих языков которые действительно используют их, даже если C# нет.
Но я не могу понять аргументы в пользу запрета целых чисел без знака, если что-то целое число без знака лучше, поскольку оно гарантирует, что индекс не будет отрицательным (так что только верхняя граница диапазона должна быть проверена).
Лучшая вещь, о которой я мог думать, - это, возможно, команда CLR решила стандартизировать знаковые целые числа, чтобы разрешить другим языкам (например, Python), которые имеют отрицательные индексы, использовать один и тот же код и обеспечивать соответствие диапазонов между языками.
У кого-нибудь есть лучшее/авторитетное объяснение того, почему .ElementAt() не допускает неподписанные ints?
-Marcin
беззнаковых целых не [CLS совместимый] (http://msdn.microsoft.com/en-us/library/12a7a7h3%28v=vs 0,110% 29.aspx). –
Спасибо. Открыл глаза на соответствие CLS. http://stackoverflow.com/questions/6325/why-are-unsigned-ints-not-cls-compliant может быть полезен и всем, кто интересуется всем этим. – Marcin