【发布时间】:2014-03-27 19:37:24
【问题描述】:
AFAIK,将基类对象强制转换为派生类型引用会引发运行时异常。但在下面的类中,这完全可以正常工作。
public class Node<T>
{
// Private member-variables
private T data;
private NodeList<T> neighbors = null;
public Node() {}
public Node(T data) : this(data, null) {}
public Node(T data, NodeList<T> neighbors)
{
this.data = data;
this.neighbors = neighbors;
}
public T Value
{
get
{
return data;
}
set
{
data = value;
}
}
protected NodeList<T> Neighbors
{
get
{
return neighbors;
}
set
{
neighbors = value;
}
}
}
}
public class BinaryTreeNode<T> : Node<T>
{
public BinaryTreeNode() : base() {}
public BinaryTreeNode(T data) : base(data, null) {}
public BinaryTreeNode(T data, BinaryTreeNode<T> left, BinaryTreeNode<T> right)
{
base.Value = data;
NodeList<T> children = new NodeList<T>(2);
children[0] = left;
children[1] = right;
base.Neighbors = children;
}
public BinaryTreeNode<T> Left
{
get
{
if (base.Neighbors == null)
return null;
else
return (BinaryTreeNode<T>) base.Neighbors[0];
}
set
{
if (base.Neighbors == null)
base.Neighbors = new NodeList<T>(2);
base.Neighbors[0] = value;
}
}
这是取自 MSDN 的示例之一的代码 - http://msdn.microsoft.com/en-us/library/ms379572(v=vs.80).aspx
据我了解,在属性 Left
(BinaryTreeNode<T>) base.Neighbors[0]
将(基本)节点转换为(派生)BinartTreeNode。这是如何工作的?
【问题讨论】:
-
base.Neighbors[0].GetType().Name报告什么?您没有显示任何对象创建(没有new Node<>或new BinaryTreeNode<>),所以我们无法知道这里的实际对象是什么。 -
base.Neighbors[0]中的项目实际上可能是BinaryTreeNode。显式转换允许您执行此操作,但如果转换在运行时失败,则会引发异常。不能保证在运行时失败,这就是您所暗示的。或者,可能会实现显式转换运算符,从而进一步混淆情况。 -
它不工作总是。如果基节点不是该类型,则会收到 InvalidCastException。