"as" 运算符的奇怪行为
strange behaviour of "as" operator
所以我有以下代码:
/// <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,3},{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, 0);
// User clones selected colors
ColorPrototype p1 = colormanager["red"].Clone();
bool isColor = p1 is Prototype.Color;
Color color1 = p1 as Color;
我的问题是为什么变量 p1 的类型为 Color
(isColor
为真)如果在克隆方法中我将结果转换为 ColorPrototype
(return this.MemberwiseClone() as ColorPrototype;
) ?
this.MemberwiseClone()
returns你Color
对象。所以p1
实际上是一个Color
。
上传到ColorPrototype
没关系。它的运行时类型仍然是Color
。这等同于:
string s = "foo";
object o = s as object;
// runtime o type is still string
if in the clone method I cast the result to ColorPrototype
因为即使您将 p1
转换为 ColorPrototype
,p1
的运行时类型仍然是 Color
类型。转换引用类型允许您将类型 T
视为类型 U
,但它不会改变基础运行时类型。
所以我有以下代码:
/// <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,3},{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, 0);
// User clones selected colors
ColorPrototype p1 = colormanager["red"].Clone();
bool isColor = p1 is Prototype.Color;
Color color1 = p1 as Color;
我的问题是为什么变量 p1 的类型为 Color
(isColor
为真)如果在克隆方法中我将结果转换为 ColorPrototype
(return this.MemberwiseClone() as ColorPrototype;
) ?
this.MemberwiseClone()
returns你Color
对象。所以p1
实际上是一个Color
。
上传到ColorPrototype
没关系。它的运行时类型仍然是Color
。这等同于:
string s = "foo";
object o = s as object;
// runtime o type is still string
if in the clone method I cast the result to ColorPrototype
因为即使您将 p1
转换为 ColorPrototype
,p1
的运行时类型仍然是 Color
类型。转换引用类型允许您将类型 T
视为类型 U
,但它不会改变基础运行时类型。