Почему первая и вторая запись работает, но не последняя? Есть ли способ, которым я могу разрешить все 3 из них и определить, было ли это 1, (int) 1 или я передал? И действительно, почему один разрешен, но последний? Второе позволение, но не последнее действительно поражает меня.
Демо, чтобы показать ошибку компиляции
using System;
class Program
{
public static void Write(short v) { }
static void Main(string[] args)
{
Write(1);//ok
Write((int)1);//ok
int i=1;
Write(i);//error!?
}
}
c#
compiler-errors
int
type-conversion
implicit-conversion
CodesInChaos
источник
источник
(short) i
.Ответы:
Первые два являются константными выражениями, последнее - нет.
Спецификация C # допускает неявное преобразование из int в короткое для констант, но не для других выражений. Это разумное правило, поскольку для констант компилятор может гарантировать, что значение соответствует целевому типу, но не может для нормальных выражений.
Это правило соответствует принципу, согласно которому неявные преобразования должны быть без потерь.
(Цитируется из C # Language Specification Version 3.0)
источник
Не существует неявного преобразования из
int
вshort
из-за возможности усечения. Однако константное выражение может рассматриваться компилятором как целевое .1
? Не проблема: это явно допустимоеshort
значение.i
? Не так много - это может быть какое-то значение>short.MaxValue
например, и компилятор не может проверить это в общем случае.источник
Expression<Func<int>>
? Затем вы можете передать() => 1
или() => i
и внутри функции вы можете проверить, содержит ли переданная сущность захваченную переменную или постоянное значение.int
литерал может быть неявно преобразован вshort
. В то время как:Итак, первые два работают, потому что неявное преобразование литералов разрешено.
источник
Я полагаю, что это потому, что вы передаете литерал / константу в первых двух, но нет автоматического преобразования типов при передаче целого числа в третьем.
Редактировать: Кто-то избил меня до этого!
источник
Потому что не будет никакого неявного преобразования между Нелитеральным типом в короткий размер большего размера.
Неявное преобразование возможно только для константного выражения.
Где, когда вы передаете
integer
значение в качестве аргументаshort
источник
Компилятор сказал вам, почему код не работает:
Итак, вот вопрос, который вы должны задать: почему это преобразование не удается? Я гуглил "c # convert int short" и оказался на странице MS C # для
short
ключевого слова:http://msdn.microsoft.com/en-us/library/ybs77ex4(v=vs.71).aspx
Как говорится на этой странице, неявное приведение к большему типу данных
short
разрешено только для литералов. Компилятор может определить, когда литерал выходит за пределы допустимого диапазона, но не иначе, поэтому ему необходимо убедиться, что вы избежали ошибки вне допустимого диапазона в логике вашей программы. Это заверение обеспечивается актерами.источник
Преобразование из int -> short может привести к усечению данных. Поэтому.
источник