2009-04-17 31 views
23

Tại sao tôi không thể xác định cả hai toán tử ngầm và rõ ràng như vậy?Tại sao tôi không thể xác định cả hai toán tử ngầm và rõ ràng?

public class C 
    { 
     public static implicit operator string(C c) 
     { 
      return "implicit"; 
     } 

     public static explicit operator string(C c) 
     { 
      return "explicit"; 
     } 
    } 

Bạn có thể làm hack này mặc dù :)

class Program 
    { 
     public class A 
     { 

     } 

     public class B 
     { 
      public static implicit operator A(B b) 
      { 
       Console.WriteLine("implicit"); 
       return new A(); 
      } 
     } 

     public class C : B 
     { 
      public static explicit operator A(C c) 
      { 
       Console.WriteLine("explicit"); 
       return new A(); 
      } 
     } 

     static void Main(string[] args) 
     { 
      C c = new C(); 

      A a = c; 
      A b = (A) c; 
     } 
    } 

in này:

implicit 
explicit 
+0

Ai nói bạn không thể? Tức là, điều gì sẽ xảy ra khi bạn thử? –

+0

Tại sao bạn muốn triển khai khác nhau giữa hai? –

+1

Ghi đè ToString thậm chí không CLOSE đến một toán tử cast ngầm. Mã ví dụ của bạn chỉ hoạt động vì Console.WriteLine có quá tải đối tượng và gọi ToString() trên đối tượng. – Samuel

Trả lời

5

Tôi không biết các giới hạn kỹ thuật có thể ngăn chặn điều này, nhưng tôi nghĩ rằng họ sẽ có thực hiện việc này để ngăn người khác tự chụp chân mình.

string imp = new C(); // = "implicit" 
string exp = (string)new C(); // = "explicit" 

Điều đó sẽ khiến tôi trở nên điên loạn và không có ý nghĩa, C chỉ được truyền sang một chuỗi 1 cách, không phải 2 cách khác nhau.

+0

Bạn có thể thực hiện theo hai cách, bạn không thể thực hiện chuyển đổi tùy chỉnh cho cả hai. – Prankster

+1

Không, bạn không thể làm điều đó, ToString không phải là toán tử truyền. – Samuel

+0

"Ví dụ" được cập nhật – Prankster

35

Kiểm tra này: Why can't coexist implicit and explicit operator of the same type in C#?

Nếu bạn xác định một nhà điều hành rõ ràng, bạn sẽ có thể làm điều gì đó như thế này:

Thing thing = (Thing)"value"; 

Nếu bạn xác định một nhà điều hành ngầm, bạn vẫn có thể làm các việc trên, nhưng bạn cũng có thể tận dụng chuyển đổi ngầm:

Thing thing = "value"; 

Nói tóm lại, rõ ràng chỉ cho phép chuyển đổi rõ ràng, trong khi tiềm ẩn cho phép cả hai rõ ràng và implici t ... do đó lý do tại sao bạn chỉ có thể xác định một.

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