无法将类强制转换为C#中的泛型类

时间:2012-09-01 07:01:17

标签: c# generics inheritance

我是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; }
}

1 个答案:

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