2011-07-19 42 views
2

代码:为什么隐式转换为int转换和截断小数?

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; } 
} 

OUTPUT: int是:1个 小数是:2.5

注释出:

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

OUTPUT: int是:1个 小数是:1

第二个版本运行时发生了什么,两种情况都输出1?

回答

4

我的猜测是,编译器看到,有一个隐式转换从Bint,并从int隐式(内置)转换为decimal,使其既可以按顺序使用。换句话说,电话变成D((decimal)(int)b)

请注意,没有东西被截断;相反,int正被提升为decimal。如果您注释掉int转换,我预计I(b)将失败,因为即使存在从Bdecimal的隐式转换,也不会从decimal转换为int

+0

我认为你是对的 - 我认为这不会编译BEC。 D(2.5)没有编译,但我只是尝试了D(2.5m),并且确定它已经工作了......谢谢! –

+0

@ Gabriel:可能是因为'2.5'是一个'double',正如你明显意识到的那样:-) –

1
在您发表评论该行出它需要整型运算符,因为有INT为十进制的隐式转换

...