相关疑难解决方法(0)

来自基类的用户定义的转换运算符

介绍

我知道"不允许在基类之间进行用户定义的转换".作为对此规则的解释,MSDN给出了"您不需要此运算符".

我确实理解不需要用户定义基类的转换,因为这显然是隐式完成的.但是,我确实需要基类转换.

在我目前的设计中,非托管代码的包装器,我使用指针存储在Entity类中.所有使用指针的类都派生自该Entity类,例如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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个演员是非法的.(注意,我没有打扰写入访问器).没有它,编译器允许我这样做:

方法B.

(Body)myEntity
...
Run Code Online (Sandbox Code Playgroud)

但是,在运行时,我会得到一个例外,说这个演员是不可能的.

结论

因此,我需要基类进行用户定义的转换,而C#拒绝它给我.使用方法A,编译器会抱怨,但代码在运行时逻辑上可以工作.使用方法B,编译器不会抱怨,但代码在运行时显然会失败.

在这种情况下我觉得奇怪的是,MSDN告诉我我不需要这个运算符,并且编译器就像隐含的一样(方法B).我应该做些什么?

我知道我可以使用:

解决方案A.

class Body : Entity
{
    Body(IntPtr pointer) : base(pointer) { }

    static Body FromEntity(Entity e)
    {
        return new Body(e.Pointer);
    } …
Run Code Online (Sandbox Code Playgroud)

c# casting

64
推荐指数
3
解决办法
2万
查看次数

标签 统计

c# ×1

casting ×1