Ответ 1
Неподписанные типы не совместимы с CLS, поэтому Stream.Write
не использует uint
для смещения и подсчета.
Смотрите: uint (ссылка на С#)
Тип uint не соответствует CLS. Используйте int по возможности.
Существует старая статья: Почему у нас нет неподписанных типов в CLS от Brad Abrams (2 сентября 2003), что объясняет причину:
Однако есть одна проблема, которая продолжает расти: почему мы не допустили неподписанные типы (UInt32 и т.п.) в CLS?
Ну, на этот вопрос есть действительно два ответа. При первом уровне некоторых языков (например, VB.NET) не предлагают полной поддержки для unsigned types. Например, вы не можете иметь неподписанные литералы в VB.NET.... Но, честно говоря, это не вполне удовлетворительный ответ потому что, когда мы начали CLS, вы не могли подкласса в VB.NET либо, но мы расширили этот язык для поддержки того, что мы знали людей хотели бы. Мы могли бы сделать то же самое с неподписанными типами. Но мы этого не сделали. Почему нет? Ну, это имеет более глубокую причину. по факту та же самая причина, почему ранние бета-версии языка С# не поддерживали неподписанные типы (no ushort, uint и т.п.).
Общее чувство среди многих из нас заключается в том, что подавляющее большинство программирования с подписанными типами. Всякий раз, когда вы переключаетесь на неподписанные типы, вы умный модельный переключатель (и уродливый литье). В худшем фильме, который вы строите для всего параллельного мира API, которые используют неподписанные типы. Значение избежания проверки "< 0" не стоит включать дженерики в CLS.
(Обратите внимание, что более новая версия VB.Net(VB 8 onwards) поддерживает неподписанные типы).
Еще одна вещь (возможно, не связанная) для добавления, Stream.Write
реализация имеет проверки на отрицательные значения:
[System.Security.SecuritySafeCritical] // auto-generated
public override void Write(byte[] array, int offset, int count) {
if (array==null)
throw new ArgumentNullException("array", Environment.GetResourceString("ArgumentNull_Buffer"));
if (offset < 0)
throw new ArgumentOutOfRangeException("offset", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (count < 0)
throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
if (array.Length - offset < count)
throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));