【问题标题】:Is there any benefit of using generic reference type parameter, if class's interface is contravariant?如果类的接口是逆变的,那么使用泛型引用类型参数有什么好处吗?
【发布时间】:2016-05-17 12:52:05
【问题描述】:

考虑这个类:

class MyClass<T> where T: class // or T: BaseClass
{
    void DoSomething1(T arg){ ... }
    void DoSomething2(T arg){ ... }
    ...
    void DoSomethingN(T arg){ ... }
}

并且没有返回T 值!即使在受保护的属性或字段中,后代也不能返回 T

与硬编码的基类类型相比,在这里使用泛型参数有什么优势吗?

【问题讨论】:

  • 我在这里看不到问题/问题。为什么要拥有返回T的函数? T 用作参数。在您的示例中,约束是指T 的“参考”能力。如果您选择T : BaseClass,那么可能没有使用通用参数的用例。
  • 我会说不,因为我看不到使用具体类型的任何可能性——如果不能使用,定义它就没有任何价值。
  • @JNS 可能还有一些优化空间。如果 T 是密封类,编译器是否可以在无需查看 VMT 的情况下发出调用?
  • @voroninp:没错……但是,我无法想象在任何用例中都能看到这种性能提升。
  • @JNS 这就是我问的原因。顺便说一句,如果泛型约束支持结构类型,那将是合理的。

标签: c# generics


【解决方案1】:

不,没有优势。由于您只传递T 类型的参数,因此您的方法本质上是contravariant,因此您不妨声明它们采用BaseClass 引用而不是T

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多