我有(例如)類型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#中,但你可以使用顯式和隱式轉換操作符來代替: