微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – “as”运算符的奇怪行为

所以我有以下代码
/// <summary>
/// The 'Prototype' abstract class
/// </summary>
abstract class ColorPrototype
{
    public abstract ColorPrototype Clone();
}

/// <summary>
/// The 'ConcretePrototype' class
/// </summary>
class Color : ColorPrototype
{
    private int _red;
    private int _green;
    private int _blue;

    // Constructor
    public Color(int red,int green,int blue)
    {
        this._red = red;
        this._green = green;
        this._blue = blue;
    }

    // Create a shallow copy
    public override ColorPrototype Clone()
    {
        Console.WriteLine(
          "cloning color RGB: {0,3},{1,{2,3}",_red,_green,_blue);

        return this.MemberwiseClone() as ColorPrototype;
    }
}

/// <summary>
/// Prototype manager
/// </summary>
class ColorManager
{
    private Dictionary<string,ColorPrototype> _colors =
      new Dictionary<string,ColorPrototype>();

    // Indexer
    public ColorPrototype this[string key]
    {
        get { return _colors[key]; }
        set { _colors.Add(key,value); }
    }
}

在我的主要方法中:

ColorManager colormanager = new ColorManager();

// Initialize with standard colors
colormanager["red"] = new Color(255,0);

// User clones selected colors
ColorPrototype p1 = colormanager["red"].Clone();
bool isColor = p1 is Prototype.Color;
Color color1 = p1 as Color;

我的问题是为什么变量p1的类型为Color(isColor为true),如果在clone方法中我将结果转换为ColorPrototype(将this.MemberwiseClone()作为ColorPrototype返回;)?

参考:http://www.dofactory.com/net/prototype-design-pattern

解决方法

if in the clone method I cast the result to ColorPrototype

因为即使将p1转换为ColorPrototype,p1的运行时类型仍为Color类型.转换引用类型允许您将类型T视为类型U,但它不会更改基础运行时类型.

原文地址:https://www.jb51.cc/csharp/99965.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐