0

我是 C# 泛型的新手,所以请多多包涵。我想将(比如说)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; }
}
4

1 回答 1

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 框架将在您运行程序时抛出异常。

于 2012-09-01T07:04:08.527 回答