为什么隐式转换为int转换和截断十进制?

时间:2011-07-19 23:06:33

标签: c# implicit-conversion

代码:

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 个答案:

答案 0 :(得分:4)

我的猜测是,编译器发现存在从Bint的隐式转换,以及从intdecimal的隐式(内置)转换,以便它可以按顺序使用。换句话说,通话变为D((decimal)(int)b)

请注意,没有任何内容被截断;相反,int正在升级为decimal。如果您反而注释int转换,我预计I(b)会失败,因为即使存在从Bdecimal的隐式转换,也没有隐式转换从decimalint

答案 1 :(得分:1)

当你对该行进行注释时,它将采用int运算符,因为存在int到decimal的隐式转换...