2010-04-28 87 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

然而,由于隐式转换 可以在不程序员的 指定它们发生时,必须小心,以防止 不愉快的意外。在一般情况下,隐式转换运算符 绝不应抛出异常,并且 绝不会丢失信息,以便在没有 程序员的意识的情况下安全地使用它们。