2011-08-04 34 views
7

Tôi có một lớp generics mà tôi đã sử dụng để ghi dữ liệu vào IsolatedStorage.C# tạo một chuyển đổi ngầm cho lớp chung?

tôi có thể sử dụng một static implicit operator T() để chuyển đổi từ lớp Generic tôi vào Generic Parameter T

ví dụ

MyClass<double> foo = new MyClass(187.0); 

double t = foo; 

Câu hỏi của tôi là, làm cách nào tôi có thể làm ngược lại?

MyClass<double> foo = new MyClass(187.0); 
double t = 0.2d; 
foo = t; 

Toán tử tiềm ẩn phải tĩnh, vì vậy tôi không chắc chắn cách tôi có thể vượt qua trong trường hợp của lớp học?

+1

Bạn định nghĩa toán tử ngầm thứ hai như thế nào? Nó sẽ trông giống như một hình ảnh phản chiếu đầu tiên (với các loại được đảo ngược). Điều đó không hoạt động? –

+0

Nó hoạt động, nhưng tôi đã hy vọng sử dụng một phương thức lớp, thay vì xây dựng một đối tượng mới. – Alan

+1

ok, nhưng vâng, không hoạt động theo cách đó. Loại chuyển đổi phải luôn tạo ra một thể hiện mới của một loại. (và thực sự, những loại đó sẽ không thay đổi) –

Trả lời

7

EDIT:

Nếu bạn muốn để có thể thay đổi giá trị của T trong lớp học của bạn, tôi sẽ khuyên bạn nên phơi bày nó như một tài sản như:

T Value { get; set; } 

Điều đó sẽ cho phép bạn thay đổi giá trị, thay vì hành vi của toán tử ngầm trả về một cá thể hoàn toàn mới của lớp.


Bạn có thể và không thể sử dụng toán tử ngầm. Làm một cái gì đó giống như

public static implicit operator int(MyType m) 
public static implicit operator MyType(int m) 

ngầm sẽ chuyển đổi từ MyType để int và từ int để MyType tương ứng. Tuy nhiên, bạn nói đúng, vì chúng tĩnh, nên int đến MyType cụ thể sẽ phải tạo một phiên bản mới là MyType và trả lại điều đó.

Vì vậy, mã này:

MyClass<double> foo = new MyClass(187.0); 
double t = 0.2d; 
foo = t; 

sẽ không thay thế các giá trị trong foo với t, các nhà điều hành ngầm sẽ trả về một hoàn toàn mớiMyClass từ t và gán đó để Foo.

+0

Để chỉnh sửa của bạn, đó là cách tôi đang làm nó ngày hôm nay. Tôi chỉ nghĩ rằng sẽ trơn tru hơn nếu không sử dụng '.Value' ở khắp mọi nơi. – Alan

+2

Tôi sẽ sử dụng '.Value' ở khắp mọi nơi. Nó giữ mã của bạn sạch hơn và dễ đọc hơn. Các toán tử ngầm là tiện dụng, nhưng việc sử dụng quá mức có thể dễ dàng làm cho mã của bạn khó đọc. Bạn đang làm đúng cách. –

1

Bạn sẽ có thể chuyển đổi theo cách khác bằng cách đơn giản quy định cụ thể khác điều hành ngầm:

public static implicit operator MyClass<T>(T input) 
{ 
    return new MyClass<T>(input); 
} 
10

Lớp này cho thấy chuyển đổi giữa T và MyClass, cả hai cách.

class MyClass<T> 
{ 
    public MyClass(T val) 
    { 
    Value = val; 
    } 

    public T Value { get; set; } 

    public static implicit operator MyClass<T>(T someValue) 
    { 
    return new MyClass<T>(someValue); 
    } 

    public static implicit operator T(MyClass<T> myClassInstance) 
    { 
    return myClassInstance.Value; 
    } 
} 
+0

Xem câu hỏi bổ sung trên http://stackoverflow.com/questions/39618845/implicit-operator-with-generic-not-working-for-interface –

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