我是C#generics的新手,所以请耐心等待。我想将类型(比如说)NodeRef的对象转换为NodeRef< TNode>。可能吗?如果,是的如何? 目前这就是我所拥有的
public class Program
{
static void Main(string[] args)
{
var nodeRef = new NodeRef();
var newNodeRef = (NodeRef<MyNode>) nodeRef;
//above line throws up at Runtime.
}
}
public class NodeRef
{
private int id;
}
public class NodeRef<TNode> : NodeRef
{
private TNode tNode;
public void Print()
{
Console.WriteLine(tNode.ToString());
}
}
我目前正在收到此异常: System.InvalidCastException。
编辑:
为什么不抛出编译时错误? MyNode只是一个虚拟类
public class MyNode
{
public int Id { get; set; }
public string Name { get; set; }
}
答案 0 :(得分:4)
此问题不是因为您使用的是泛型。问题是NodeRef<T>
是 NodeRef
。但并非所有NodeRef
都必须NodeRef<T>
。这取决于您第一次调用new
时所写的内容。
如果您将派生对象写成如下所示,也会发生这种情况:
public class SomeDerivedClass : NodeRef
{
// ...
}
static void Main(string[] args)
{
var nodeRef = new NodeRef();
var newNodeRef = (SomeDerivedClass) nodeRef;
}
对于强制转换,你必须转换为与实际实例(调用new
时指定的类型)或其基类之一相同的类型。例如,此代码不会抛出异常:
public class Program
{
static void Main(string[] args)
{
NodeRef nodeRef = new NodeRef<MyNode>();
var newNodeRef = (NodeRef<MyNode>) nodeRef;
}
}
像这样的强制转换不会将对象实例的类型转换为另一种类型(除非您编写自定义转换运算符,这是您在此处未执行的操作)。这些类型的强制转换只是让你告诉编译器“我知道对象实际上是另一种类型。让我用这种方式工作”。如果出错,.Net框架将在您运行程序时抛出异常。