Почему .Net не может конвертировать из коротких в int? - PullRequest
0 голосов
/ 15 марта 2012

Один из моих типов данных в SqlServer - smallint, и он сопоставляется с short или Int16 в .NET. Я использовал простой цикл for, в котором я был int, и он сказал мне, что не может неявно конвертировать между ними?

Мне просто интересно, почему это невозможно? Это просто чтобы помешать вам использовать большее число, чем может удержать шорт? Мне кажется странным, потому что я на 80% уверен, что мне никогда не приходилось конвертировать int в long?

Образец:

public Int16 Test()
{
    int i = 2;
    return i;
}

Ответы [ 4 ]

5 голосов
/ 15 марта 2012

Должно существовать неявное значение от short до int, поскольку вы переходите от узкого к широкому, от широкого к узкому не поддерживается неявно из-за потенциальной потери данных. Компилятор позволяет вам игнорировать это, но требует, чтобы вы в явном виде приводили , чтобы указать, что вы поняли потенциал и с ним все в порядке.

Обновление:

Ваш код сужается и не может быть выполнен неявно. Исправлено:

public Int16 Test()
{
    int i = 2;
    return (Int16)i;
}

Хотя, чтобы быть шутливым, в этом конкретном случае компилятор теоретически может знать, что потеря данных не произойдет. В остальные 99,99% случаев он не может знать об этом во время компиляции, поэтому поддерживается только явное приведение, где может произойти потеря данных.

Это явно возлагает ответственность на разработчика, так что, когда возникает ошибка во время выполнения из-за потери данных, разработчик должен был бы сознательно принять это решение заранее и не имеет юридического права швырять ругательства на компьютер.

VB.NET позволяет обойти даже это ограничение с помощью Option Strict:

http://msdn.microsoft.com/en-us/library/k1e94s7e(v=vs.80).aspx

Итак, я предполагаю, что это выбор дизайна для C #.

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

Преобразование последствий будет выполняться только для преобразований без сужения (для предотвращения потери данных).

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

Существует предопределенное неявное преобразование из short в int, long, число с плавающей запятой, двойное или десятичное число.

http://msdn.microsoft.com/en-us/library/ybs77ex4%28v=vs.71%29.aspx

0 голосов
/ 15 марта 2012

Это зависит от того, какой язык вы используете.

VB будет конвертировать без проблем по умолчанию, если вы не переполняете Int16.Если вы включите Option Strict, вам придется выполнить преобразование самостоятельно: Convert.ToInt16(yourInt32)

В c # вы должны разыграть его: (Int16)yourInt32

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