Не совсем выглядит логичным почему выбирается метод с 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}");
}
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Здравствуйте, 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>>
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Здравствуйте, 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>>