Почему недопустимо присваивать целочисленное значение параметру uint в аргументе метода C #? - PullRequest
8 голосов
/ 15 марта 2012

При назначении значения по умолчанию параметру uint в аргументе метода C #, как показано в первом блоке кода ниже, я получаю сообщение «Значение типа int нельзя использовать в качестве параметра по умолчанию потому что нет стандартных преобразований для типа 'uint' ", тогда как при присваивании int переменной uint в теле метода это нормально.

Код компилируется; предупреждение предоставляется с помощью красного, волнистого подчеркивания в Visual Studio 2010.

void GetHistoricData(uint historyLength = 365) 
{
    uint i = 365; // this is valid
}

Это легко решается с помощью 365U вместо 365, таким образом:

void GetHistoricData(uint historyLength = 365U) 
{
    // method body
}

Мне действительно трудно найти хорошее объяснение того, почему недопустимо присваивать int параметру uint в параметре, когда это допустимо делать в другом месте. Кто-нибудь может мне помочь с моментом «лампочки», который я пытаюсь найти?

Ответы [ 3 ]

1 голос
/ 15 марта 2012

Учитывая, что вы выполняете приведение, и, возможно, также обрезаете значение, я предполагаю , только Visual Studio предупреждает о том, что может возникнуть потенциальная проблема, и приглашает сделать этот акт явным.Особенно, если речь идет о параметрах по умолчанию, значение по умолчанию должно быть четко указано.Вместо этого, в случае неявного приведения, всегда есть место для сомнений относительно того, на что будет похоже значение приведения.

1 голос
/ 15 марта 2012

Красное подчеркивание обычно означает, что вы не можете скомпилировать. Анализатор кода на VS иногда дает сбой, выдает ложные сообщения об ошибках и предупреждения, которые все еще компилируются. Перезапуск VS обычно избавляет от них.

1 голос
/ 15 марта 2012

Он компилируется для меня, с версиями компилятора 4.0.30319.1 и 4.0.30319.17379.

Если вы используете более старую версию или другой компилятор (например, Mono), то я подозреваю, что это простоошибка.

РЕДАКТИРОВАТЬ: Если он компилируется нормально (и я вообще не могу выдать предупреждение от компилятора), то я подозреваю , это какой-то плагин, такой как ReSharper.(Не то чтобы я видел это и в ReSharper ...)

Я не могу воспроизвести это в VS2010.

Я бы посоветовал вам сделать обновитькод для того, чтобы без предупреждения, просто для удобства чтения - но это все еще действительный код без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...