Почему неявное преобразование в int конвертирует и усекает десятичное число? - PullRequest
2 голосов
/ 20 июля 2011

Код:

void Main()
{
    C.F();
}
public class C
{
    public static void F()
    {
        var a = new A { i = 1, d = 2.5m };
        var b = new B(a);
        I(b);
        D(b);
    }
    static void I(int i) { Console.WriteLine("int is: " + i); }  
    static void D(decimal d) { Console.WriteLine("decimal is: " + d); }
}
public class A
{
    public int i;
    public decimal d;
}
public class B
{
    A _a;
    public B(A a) { _a = a; }
    public static implicit operator int(B b) { return b._a.i; }
    public static implicit operator decimal(B b) { return b._a.d; }
}

ВЫХОД: int это: 1 десятичное число: 2,5

Комментарий:

//public static implicit operator decimal(B b) { return b._a.d; }

ВЫХОД: int: 1 десятичное число: 1

Что происходит, когда запускается вторая версия и выдает 1 для обоих случаев?

Ответы [ 2 ]

4 голосов
/ 20 июля 2011

Я предполагаю, что компилятор видит, что существует неявное преобразование из B в int и неявное (встроенное) преобразование из int в decimal, так что он может использовать оба в последовательность. Другими словами, вызов становится D((decimal)(int)b).

Обратите внимание, что ничего не обрезается; скорее, int повышается до decimal. Если вместо этого вы закомментируете преобразование int, я ожидаю, что I(b) не удастся, поскольку, хотя существует неявное приведение от B до decimal, неявное приведение от decimal до int .

1 голос
/ 20 июля 2011

когда вы комментируете эту строку, требуется оператор int, потому что существует неявное преобразование int в десятичное ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...