2010-02-07 2 views
2

a) Не должно ли следующее присваивание вызывать ошибку, поскольку число 100 является литералом типа int и поскольку компилятор не допускает неявных сужений конверсий?Литералы и неявное сужение конверсий

byte b = 100; 


б) Если компилятор не жалуется неявным сужающее преобразованием из междунар буквального к типу байты, то почему не он также позволяет неявное преобразования сужающегося от двойных literal to type float (я понимаю, мы могли бы избежать этой ошибки, указав плавающий литерал с использованием суффикса F/f)?

byte b=16; //OK 
float f1=16.9; //error 


спасибо

+0

Правила преобразования с плавающей запятой назад, но это то, что они есть. Нет никакой веской причины, почему 'float f = (float) (1.0/10.0);' должен требовать typecast ('f' будет содержать наиболее точное представление 0,1, возможного для его типа), но' double d = 1.0f/10.0 f; 'будет компилироваться без предупреждения, даже если значение, присвоенное' d' (относительно точности двойника), не должно быть около 0,1. – supercat

ответ

4

Это описано в разделе 6.1.8 на C# языка спецификации. Для постоянных выражений типа int можно преобразовать в sbyte, byte, short, ushort, uint или ulong при условии, что значение находится в пределах целевого типа. Для компилятора C# довольно легко определить, находится ли значение в соответствующем диапазоне и, следовательно, разрешить преобразование.

Что касается двойного футляра, спецификация C# lang специально не указывает, почему это запрещено. Я предполагаю, что это связано с трудностями при определении того, может ли двойное значение вписываться в значение float. Получение точности с плавающей запятой является очень сложной задачей и, вероятно, так много, поэтому она не считалась стоимой (если это было возможно вообще)

+0

Благодарим вас за помощь – AspOnMyNet

Смежные вопросы