我有(例如)类型A的对象,我希望能够转换为B型(类似于如何可以施放int
到float
)转换数据类型之间的C#
数据类型A和B是我自己的。
是否可以定义发生此铸造的规则?
例
int a = 1;
float b = (float)a;
int c = (int)b;
我有(例如)类型A的对象,我希望能够转换为B型(类似于如何可以施放int
到float
)转换数据类型之间的C#
数据类型A和B是我自己的。
是否可以定义发生此铸造的规则?
例
int a = 1;
float b = (float)a;
int c = (int)b;
是的,这是可能的,使用C#运算符重载。有两个版本explicit和implicit。
这是一个完整的例子:
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型
假设你想要的是一个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:
然而,由于隐式转换 可以在不程序员的 指定它们发生时,必须小心,以防止 不愉快的意外。在一般情况下,隐式转换运算符 绝不应抛出异常,并且 绝不会丢失信息,以便在没有 程序员的意识的情况下安全地使用它们。
你不能重载转换运算符在C#中,但你可以使用显式和隐式转换操作符来代替: