2010-04-28 77 views
11

我有(例如)類型A的對象,我希望能夠轉換爲B型(類似於如何可以施放intfloat轉換數據類型之間的C#

數據類型A和B是我自己的。

是否可以定義發生此鑄造的規則?

int a = 1; 
float b = (float)a; 
int c = (int)b; 

回答

14

是的,這是可能的,使用C#運算符重載。有兩個版本explicitimplicit

這是一個完整的例子:

class Program 
{ 
    static void Main(string[] args) 
    { 
     A a1 = new A(1); 
     B b1 = a1; 

     B b2 = new B(1.1); 
     A a2 = (A)b2; 
    } 
} 

class A 
{ 
    public int Foo; 

    public A(int foo) 
    { 
     this.Foo = foo; 
    } 

    public static implicit operator B(A a) 
    { 
     return new B(a.Foo); 
    } 
} 

class B 
{ 
    public double Bar; 

    public B(double bar) 
    { 
     this.Bar = bar; 
    } 

    public static explicit operator A(B b) 
    { 
     return new A((int)b.Bar); 
    } 
} 

A型可以隱式轉換爲B型,但B型必須明確地轉換爲A型

4

假設你想要的是一個explcit操作你需要寫一個顯式類型轉換操作符,像這樣:

public static explicit operator MyTypeOne(MyTypeTwo i) 
{ 
    // code to convert from MyTypeTwo to MyTypeOne 
} 

然後,您可以使用它,像這樣:

MyTypeOne a = new MyTypeOne(); 
MyTypeTwo b = (MyTypeTwo)a; 

我會懷疑你是否想將一種類型轉換爲另一種類型,或者你是否真的想轉換。我想說,如果你只是想利用一個很好的語法,你應該避免寫轉換操作符:)

另外,一般建議不要使用隱式轉換,因爲它們允許意外的類型converstions。從MSDN documentation on implicit

然而,由於隱式轉換 可以在不程序員的 指定它們發生時,必須小心,以防止 不愉快的意外。在一般情況下,隱式轉換運算符 絕不應拋出異常,並且 絕不會丟失信息,以便在沒有 程序員的意識的情況下安全地使用它們。