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)、またはその基本クラスの 1 つにキャストする必要があります。たとえば、次のコードは例外をスローしません。

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 に答える