我有这段代码:
public class Leg : ProxiestChild
{
public virtual Name { get; set; }
}
问题是:
var leg = new Leg(); // leg is not Leg, instead ProxiedLeg
var trueleg = (Leg)leg; // exception leg is a ProxiedLeg
我需要这样的东西
public class ProxiestChild
{
// some method that overloads explicit CAST
// where receiving the proxied object i returns the unproxied object
// to be casted
}
答案 0 :(得分:13)
您可以使用转化运算符implicit
或explicit
实现自定义类型转换。
转换运算符可以是显式的也可以是隐式的。隐式转换运算符更易于使用,但当您希望运算符的用户意识到正在进行转换时,显式运算符非常有用。本主题演示了这两种类型。
这是显式转换运算符的示例。此运算符从类型Byte转换为名为Digit的值类型。因为并非所有字节都可以转换为数字,所以转换是显式的,这意味着必须使用强制转换,如Main方法中所示。
struct Digit
{
byte value;
public Digit(byte value) //constructor
{
if (value > 9)
{
throw new System.ArgumentException();
}
this.value = value;
}
public static explicit operator Digit(byte b) // explicit byte to digit conversion operator
{
Digit d = new Digit(b); // explicit conversion
System.Console.WriteLine("Conversion occurred.");
return d;
}
}
class TestExplicitConversion
{
static void Main()
{
try
{
byte b = 3;
Digit d = (Digit)b; // explicit conversion
}
catch (System.Exception e)
{
System.Console.WriteLine("{0} Exception caught.", e);
}
}
}
// Output: Conversion occurred.
此示例通过定义转换运算符来演示隐式转换运算符,该运算符撤消前一个示例所执行的操作:它从名为Digit的值类转换为整数Byte类型。因为任何数字都可以转换为Byte,所以无需强制用户明确转换。
struct Digit
{
byte value;
public Digit(byte value) //constructor
{
if (value > 9)
{
throw new System.ArgumentException();
}
this.value = value;
}
public static implicit operator byte(Digit d) // implicit digit to byte conversion operator
{
System.Console.WriteLine("conversion occurred");
return d.value; // implicit conversion
}
}
class TestImplicitConversion
{
static void Main()
{
Digit d = new Digit(3);
byte b = d; // implicit conversion -- no cast needed
}
}
// Output: Conversion occurred.
来自:http://msdn.microsoft.com/en-us/library/85w54y0a(v=VS.100).aspx
要小心这一点,为了便于阅读,看到一种神奇地投射到另一种类型通常会让人感到困惑 - 人们并不总是首先认为存在转换操作符。