2013-02-08 25 views
6

Với đoạn mã sau:quy tắc chuyển đổi cho các nhà khai thác chuyển đổi quá tải

using System; 

namespace Test721 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      Console.WriteLine(new A()); //prints 666 
      Console.WriteLine(new B()); //prints 666 
      Console.ReadLine(); 
     } 
    } 

    public class A 
    { 
     public static implicit operator int(A a) 
     { 
      return 666; 
     } 
    } 

    public class B : A 
    { 
     public static implicit operator double(B b) 
     { 
      return 667; 
     } 
    } 
} 

kết quả là như trong các ý kiến ​​- cả hai dòng in 666.

tôi mong đợi Console.WriteLine(new B()); viết 667, trong khi có a double quá tải của Console.WriteLine.

Tại sao điều đó lại xảy ra?

Trả lời

7

này được đề cập trong phần 7.4.3.4 của 3,5 C# đặc tả ngôn ngữ. Phần này đề cập đến độ phân giải quá tải và cách chuyển đổi được xem xét trong quá trình này. Dòng áp dụng là

Nếu chuyển đổi ẩn từ T1 sang T2 tồn tại và không chuyển đổi ẩn từ T2 sang T1, C1 là chuyển đổi tốt hơn.

Trong trường hợp này có một chuyển đổi ngầm từ B cho cả int (T1) và double (T2). Có một chuyển đổi tiềm ẩn từ int đến double nhưng không phải theo cách khác. Do đó, chuyển đổi tiềm ẩn từ B thành int được coi là tốt hơn và thắng.

+0

Câu trả lời hay nhất tôi có thể mong đợi, cảm ơn bạn. Tôi sẽ chấp nhận trong một phút, khi SO cho phép tôi;] –

+0

Tôi có đúng với giả định rằng các quy tắc này sẽ làm cho trình biên dịch nghĩ rằng một 'float' vượt trội hơn một' double'? Điều đó có vẻ khá rực rỡ. – supercat

0

Vì bạn đang không xác định những gì để đúc các giá trị cho các biên dịch là làm

Console.WriteLine((int)(new B())); 

Bạn nên sử dụng sau đây thay vì

Console.WriteLine((double)(new B())); 
+0

Có trình biên dịch đang làm điều này nhưng OP hỏi "tại sao" trình biên dịch đang làm điều này. – JaredPar

Các vấn đề liên quan