Суффикс С# за числовым литералом
Я новичок в С# и хочу понять, как работают ценности. Если я посмотрю на нормальное целочисленное значение, в нем есть 3 важные части: тип, имя и значение.
int testInt = 3;
| | |
Type Name Value
Но когда я вижу значение float, это меня немного путает из-за суффикса F
.
float testFloat = 3.0F;
| | | |
Type Name Value Type
Теперь в нем есть два типа, и без суффикса F
значение будет двойным. Но почему это происходит, когда я могу объявить двойную переменную с помощью
double testDouble = 3.0D;
double
в качестве первого слова должно быть достаточно, не так ли? То же самое относится к десятичному значению с суффиксом M:
decimal testDecimal = 3.0M;
Тогда это начинает меня смущать, когда дело доходит до других суффиксов:
ulong bigOne = 2985825802805280508UL;
Я использовал ulong
в тесте раньше и знаю, что u
предназначен для "без знака" и позволяет значение в два раза выше обычного. Затем вы получаете U снова как суффикс, а L - буквально, как сказал google. Насколько я понимаю, "литералы" - это типы значений, которые содержат числа. Но я не понимаю, почему этот улунг работает даже без суффикса?
ulong bigOne = 2985825802805280508;
Затем я попробовал что-то другое, чтобы понять важность суффикса
byte testLong = 12312UL;
Это не сработало, потому что значение слишком велико для байта (254), и суффикс не преобразовывает его в длинную переменную.
Почему не первое слово (тип) недостаточно для объявления? Первое слово должно быть достаточно, чтобы указать тип. Лучше ли всегда давать значения суффикс?
Ответы
Ответ 1
Здесь вы смешиваете две разные вещи:
float testFloat = 3.0F;
float
сообщает компилятору, что переменная testFloat
wil является значением с плавающей запятой. F
сообщает компилятору, что буква 3.0
является float
. Компилятор должен знать обе части, прежде чем он сможет решить, может ли он присваивать литерал переменной без преобразования или неявного преобразования.
Например, вы можете сделать это:
float testFloat = 3;
И это хорошо. Поскольку компилятор увидит 3
как целое число буквально, но он знает, что он может назначить это поплавку без потери точности (это неявное преобразование). Но если вы это сделаете:
float testFloat = 3.0;
3.0
является буквальным двойным (потому что это по умолчанию без суффикса), и он не может неявно (т.е. автоматически) преобразовать double в float, потому что float имеет меньшую точность. Другими словами, информация может быть потеряна. Таким образом, вы либо сообщаете компилятору, что это буквальный float:
float testFloat = 3.0F;
Или вы скажете, что с потерей точности вы можете справиться с какой-либо точностью:
float testFloat = (float)3.0;
Ответ 2
Все выражения 1 должны быть разрешены для типа. Таким образом, выражение 42
всегда должно иметь ровно один тип (это будет int
). Это не может быть int
, если вы назначаете его переменной int
и double
, если вы назначили ее double
. Контекст, в котором используется выражение, никогда не используется 1 чтобы определить, к какому типу он решает.
Вот почему числовые литералы могут иметь суффиксы; это способ определения типа этого выражения в этом выражении.
Обратите внимание, что существуют также неявные преобразования между многими числовыми типами, поэтому, если вы пишете double d = 42;
, выражение 42
на самом деле является целым числом, но на нем выполняется неявный оператор преобразования, который преобразует его в double
перед назначением.
1 Здесь есть несколько исключений, таких как lambdas, которым тип выражения зависит от того, как он используется, и групп методов; в вакууме эти выражения не имеют типа.
Ответ 3
Существует другой способ объявить переменную без указания типа перед именем:
var myNumber = 10;
В этом случае тип переменной будет определяться литеральным значением.
Если вы используете тип (double | float | int |...) вместо "var", компилятор делает преобразование буквенного значения в тип переменной (когда это возможно).
Итак, я думаю, что суффикс важен, когда вы используете "var" для объявления переменных, а тип значения literal не является значением по умолчанию, когда суффикс не используется;
Есть еще одна причина, когда суффикс использования слишком полезен, например, в ситуации, когда вы хотите сделать неявные преобразования в выражениях.