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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.