0

基本クラスを派生クラスに昇格させてそのまま使用するシステムを作成しようとしていますが、以下のエラーが表示された場合は、NodeType が派生型でなくても「NodeType」を派生型に変換しようとしているようです。本当のタイプではありません。

これは動作しません:

class Node {}
class Navpoint : Node {}
class Jumppoint : Node {}

class Actor {
  public static void on<NodeType>(Actor actor, Node node) where NodeType : Node {
     actor.Navigate(node as NodeType);  // error: (CS1502) cannot convert NodeType to Navpoint
  }

  private static IDictionary<System.Type, Navigation> navigations = 
    new Dictionary<System.Type, Navigation>() {
     {typeof(Navpoint), on<Navpoint>},
     {typeof(Jumppoint), on<Jumppoint>},
  };

  public void Navigate(Node node) {
   navigations[node.GetType()](this, node);
  }
 public void Navigate(Navpoint navpoint) {
     // do something with navpoint
  }
  public void Navigate(Jumppoint jumppoint) {
     // do something with jumppoint
 }
}

ただし、これは機能します。

class Node {}
class Navpoint : Node {}
class Jumppoint : Node {}

class Actor {
  public static void onNavpoint(Actor actor, Node node) {
     actor.Navigate(node as Navpoint);  // works fine
  }
  public static void onJumppoint(Actor actor, Node node) {
     actor.Navigate(node as Jumppoint);  // works fine
  }

  private static IDictionary<System.Type, Navigation> navigations = 
    new Dictionary<System.Type, Navigation>() {
     {typeof(Navpoint), onNavpoint},
     {typeof(Jumppoint), onJumppoint},
 };

  public void Navigate(Node node) {
    navigations[node.GetType()](this, node);
  }
  public void Navigate(Navpoint navpoint) {
     // do something with navpoint
 }
  public void Navigate(Jumppoint jumppoint) {
     // do something with jumppoint
 }
}

20行ほどのコード行をほぼ重複して入力することはそれほど大したことではありませんが、私の質問はなぜですか?

また、Unity と MonoDevelop を使用していますが、.NET がこれを別の方法で処理するかどうかはわかりません..

4

0 に答える 0