代码:
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时会发生什么?
答案 0 :(得分:4)
我的猜测是,编译器发现存在从B
到int
的隐式转换,以及从int
到decimal
的隐式(内置)转换,以便它可以按顺序使用。换句话说,通话变为D((decimal)(int)b)
。
请注意,没有任何内容被截断;相反,int
正在升级为decimal
。如果您反而注释int
转换,我预计I(b)
会失败,因为即使存在从B
到decimal
的隐式转换,也没有隐式转换从decimal
到int
。
答案 1 :(得分:1)
当你对该行进行注释时,它将采用int运算符,因为存在int到decimal的隐式转换...