2010-01-06 29 views
8

Nếu tôi viết một lớp chung chung như lớp MyGeneric<T> là nó có thể viết một diễn viên tiềm ẩn để gõ T, vì vậy tôi có thể làm công cụ như:ngầm đúc một generic <T> trở lại T

public class MyGeneric<T> 
{ 
... 
} 

public class GenericProperties 
{ 
    public MyGeneric<string> MyGenericString {get;set;} 

    public void UseMyGeneric() 
    { 
     string sTest = MyGenericString; 
     MyGenericString = "this is a test"; 
    } 
} 

Có thể làm điều đó bằng cách quá tải các toán tử? Tôi biết nó có thể được thực hiện nếu lớp học của tôi không phải là một chung chung ...

Trả lời

19

Vâng, vâng, nhưng đối với tình yêu của jesus zombie KHÔNG làm điều đó. Nó thực sự khó hiểu. Bạn đang hiểu nhầm một chút về mục đích của generics, tôi nghĩ vậy. Nó không được sử dụng để "biến" một lớp thành loại đó, nó được sử dụng để có loại (MyGenericString) là 'nhận thức' của loại bạn muốn, cho các mục đích khác nhau (thường là những mục đích dựa trên bộ sưu tập).

+11

+1 chỉ dành cho "vì tình yêu của zombie jesus" LOL –

+0

Tôi đồng ý, tính năng này hữu ích, nhưng ví dụ được cho là có vẻ tồi tệ và cho biết có thể hiểu nhầm về mục đích của generics. –

21

vâng .. nhưng đừng làm quá mức, điều này có xu hướng gây nhầm lẫn cho mọi người. tôi sẽ chỉ sử dụng nó cho các loại bao bọc.

class Wrapper<T> 
{ 
    public T Value {get; private set;} 
    public Wrapper(T val) {Value = val;} 

    public static implicit operator T(Wrapper<T> wrapper) {return wrapper.Value;} 
    public static implicit operator Wrapper<T>(T val) {return new Wrapper<T>(val);} 
} 



var intWrapper = new Wrapper<int>(7); 
var usingIt = 7 * intWrapper; //49 

Wrapper<int> someWrapper = 9; //woohoo 
+2

Tôi đã upvoted bạn, bởi vì nó về mặt kỹ thuật chính xác (loại tốt nhất của chính xác), nhưng thực sự, tôi nghĩ rằng nó gần như không bao giờ thích hợp để làm điều này. Tôi hy vọng OP nhận ra điều đó. –

+0

cảm ơn. tôi cũng bình chọn cho bạn, vì jesus zombie, và bởi vì tôi đồng ý. – dan

+0

Tôi rất muốn nhìn thấy một thực tế sử dụng cho việc này. –

0

Có nó có thể sử dụng ngầm Conversion Operator Overloading

class Program 
{ 
    static void Main(string[] args) 
    { 
     myclass<string> a = new myclass<string>(); 
     a.inner = "Hello"; 
     string b = a; 
     Console.WriteLine(b); 
    } 
} 

class myclass<T> 
{ 
    public T inner; 
    public myclass() 
    { 

    } 
    public static implicit operator T(myclass<T> arg1) 
    { 
     return arg1.inner; 
    } 
} 
14

Như những người khác đã nói, đó là pháp nhưng nguy hiểm. Có nhiều cạm bẫy bạn có thể rơi vào. Ví dụ: giả sử bạn đã xác định toán tử chuyển đổi do người dùng xác định giữa C<T> và T. Sau đó, bạn nói

C<object> c = new C<object>("hello"); 
object o = (object) c; 

Điều gì sẽ xảy ra? sao chuyển đổi do người dùng xác định của bạn có chạy hay không? Không, vì c đã là một đối tượng.

Như tôi đã nói, có điên trường hợp bạn có thể tham gia khi bạn cố xác định các toán tử chuyển đổi chung; không làm điều đó trừ khi bạn có một sự hiểu biết sâu sắc và chi tiết về phần 10.10.3 của đặc điểm kỹ thuật.

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