С# long to float/double
От: okon  
Дата: 11.04.19 12:27
Оценка:
Не совсем выглядит логичным почему выбирается метод с float параметром,
а также в случае если заменяем Test(double) на Test(decimal) то компилятор не может выбрать между двумя методами и ошибка компиляции.
В случае с параметром Test(double) ошибки компиляции нету.

void static Test()
{
   Test(1L);
}

void static Test(double value)
{
   Console.WriteLine($"double = {value}");
}

void static Test(float value)
{
   Console.WriteLine($"float = {value}");
}



void static Test()
{
   Test(1L);
}

void static Test(decimal value)
{
   Console.WriteLine($"double = {value}");
}

void static Test(float value)
{
   Console.WriteLine($"float = {value}");
}
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Отредактировано 11.04.2019 12:27 okon . Предыдущая версия .
Re: С# long to float/double
От: romangr Россия  
Дата: 11.04.19 13:01
Оценка: 79 (3)
Здравствуйте, okon, Вы писали:

O>Не совсем выглядит логичным почему выбирается метод с float параметром,

O>а также в случае если заменяем Test(double) на Test(decimal) то компилятор не может выбрать между двумя методами и ошибка компиляции.
O>В случае с параметром Test(double) ошибки компиляции нету.

O>
O>void static Test()
O>{
O>   Test(1L);
O>}

O>void static Test(double value)
O>{
O>   Console.WriteLine($"double = {value}");
O>}

O>void static Test(float value)
O>{
O>   Console.WriteLine($"float = {value}");
O>}
O>


Разберем пока с выбором float/double
Читаем спецификацию:

7.5.3.4 Better conversion from type
Given a conversion C1 that converts from a type S to a type T1, and a conversion C2 that converts from a type S to a type T2, C1 is a better conversion than C2 if at least one of the following holds:

· An identity conversion exists from S to T1 but not from S to T2

· T1 is a better conversion target than T2 (§7.5.3.5)

7.5.3.5 Better conversion target
Given two different types T1 and T2, T1 is a better conversion target than T2 if at least one of the following holds:

· An implicit conversion from T1 to T2 exists, and no implicit conversion from T2 to T1 exists


T1 — float, T2 — double.

long имеет implicit conversion в float и double
float также имеет implicit conversion в double
у double нет implicit conversion в float

Поэтому выбирается метод Test(float value).
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[2]: С# long to float/double
От: okon  
Дата: 11.04.19 13:04
Оценка:
R>у double нет implicit conversion в float
R>Поэтому выбирается метод Test(float value).

А у decimal есть ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[3]: С# long to float/double
От: romangr Россия  
Дата: 11.04.19 13:17
Оценка: 79 (3)
Здравствуйте, okon, Вы писали:

R>>у double нет implicit conversion в float

R>>Поэтому выбирается метод Test(float value).

O>А у decimal есть ?


Опять читаем спецификацию

6.1.2 Implicit numeric conversions
The implicit numeric conversions are:

· From sbyte to short, int, long, float, double, or decimal.

· From byte to short, ushort, int, uint, long, ulong, float, double, or decimal.

· From short to int, long, float, double, or decimal.

· From ushort to int, uint, long, ulong, float, double, or decimal.

· From int to long, float, double, or decimal.

· From uint to long, ulong, float, double, or decimal.

· From long to float, double, or decimal.

· From ulong to float, double, or decimal.

· From char to ushort, int, uint, long, ulong, float, double, or decimal.

· From float to double.


Здесь получается, что нет implicit conversion ни из float в decimal, ни из decimal в float.
Компилятор не может выбрать метод и ругается.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.