代码之家  ›  专栏  ›  技术社区  ›  George Mauer

C 4.0:如何找出类型是否在协方差上相等

  •  4
  • George Mauer  · 技术社区  · 15 年前

    例如我有

    interface ICommand {}
    class MovePiece : ICommand {}
    class Successful<CMD> where CMD : ICommand {}
    

    我想要以下内容:

    CovariantlyEqual(
      typeof(Successful<ICommand>), 
      typeof(Successful<MovePiece>))
    .ShouldEqualTrue()
    

    更新 埃里克在下面问我为什么要测试这样的东西。够公平的。我认为,在很多情况下,检查这种“平等”的能力很容易是有用的。以一个简单的事件聚合器为例-您希望能够告诉它您有兴趣订阅所有成功的命令。同时,另一个组件只对成功的movepiece事件感兴趣。

    我想我错了,但我认为这就是协变和逆变的意义所在。在这里,平等可能是一个错误的术语,但很明显类型定义之间存在某种关系。 Successful<MovePiece> Successful<ICommmand> 语言中是否没有任何东西可以轻易地暴露出来?

    1 回复  |  直到 15 年前
        1
  •  4
  •   BFree    15 年前

    首先,即使这种方法确实存在,在您的情况下,它不应该等于真,原因有两个:(事实上,如果确实存在 Success<ICommand> c = new Success<MovePiece>() 它甚至不会编译。)

    1. 只有泛型委托或泛型接口可以标记为变量,而不是类
    2. 你需要明确地用 in out 参数。

    尽管如此,这里有一个小小的修改:

    interface ICommand { }
    class MovePiece : ICommand { }
    interface ISuccessful<out CMD> where CMD : ICommand { }
    class Implementation<CMD> : ISuccessful<CMD> where CMD : ICommand { }
    

    一旦你有了它,你就可以使用 IsAssignableFrom() 方法对 Type :

    bool b = typeof(ISuccessful<ICommand>).IsAssignableFrom(typeof(Implementation<MovePiece>));
    Console.WriteLine(b);
    

    这将输出 true .