我知道“用户定义的转换或从基类不允许”。作为对这条规则的解释,MSDN给出了“你不需要这个操作符。”
我明白,用户定义的转换到基类是不需要的,因为这显然是隐含地完成的。但是,我确实需要从转换一个基类。
在我目前的设计中,非托管代码的包装,我使用一个指针,存储在一个实体类。 所有使用指针的类都来自该实体类,例如Body类。
因此,我有:
方法A
class Entity
{
IntPtr Pointer;
Entity(IntPtr pointer)
{
this.Pointer = pointer;
}
}
class Body : Entity
{
Body(IntPtr pointer) : base(pointer) { }
explicit operator Body(Entity e)
{
return new Body(e.Pointer);
}
}
这是铸非法的。 (请注意,我没有写入访问器)。 没有它,编译器将允许我这样做:
方法B
(Body)myEntity
...
然而,在运行时,我会得到一个异常说这个转换是不可能的。
结论
所以我在这里,需要从一个用户定义的转换一个基类和C#它拒绝了我。使用方法A,编译器会投诉,但代码在运行时会逻辑运行。使用方法B,编译器不会抱怨,但代码在运行时显然会失败。
我在这种情况下发现奇怪的是,MSDN告诉我我不需要这个运算符,并且编译器行为好像它可以隐式(方法B)。我应该做些什么?
我知道我可以使用:
解决方案A
class Body : Entity
{
Body(IntPtr pointer) : base(pointer) { }
static Body FromEntity(Entity e)
{
return new Body(e.Pointer);
}
}
溶液B
class Body : Entity
{
Body(IntPtr pointer) : base(pointer) { }
Body(Entity e) : base(e.Pointer) { }
}
C液
class Entity
{
IntPtr Pointer;
Entity(IntPtr pointer)
{
this.Pointer = pointer;
}
Body ToBody()
{
return new Body(this.Pointer);
}
}
但说实话,所有这些语法都很糟糕,实际上应该是强制转换。 那么,有什么方法可以使演员工作?这是C#设计缺陷还是我错过了一种可能性?就好像C#不相信我足够使用他们的投射系统编写我自己的基到子转换。
是否有人认为演员操作员做了太多事情?向上转换,向下转换,装箱/取消装箱,用户定义的转换... C++在多年前将其转换操作员分开;也许现在是C#效仿的时候了? – 2010-08-14 10:52:59