【问题标题】:Generic parameters: ensure different types [duplicate]通用参数:确保不同的类型
【发布时间】:2013-08-19 16:18:34
【问题描述】:

我有一个有两个泛型参数的类。我想将第二个泛型参数限制为与第一个不同的类型。有没有办法在编译时做出这样的限制?在运行时检查类型不是很有用。

public class Test<A, B>
    where B : not_typeof(A)
{
    // ...
}

【问题讨论】:

  • 确实,这是一个稍微不同的场景,但最终它与@Sam 链接到的答案相同
  • 您还有其他限制吗?因为当您拥有where A : IUtensilwhere B : IVehicle 时,为什么还要关心用户是否拥有Test&lt;Forklift, Forklift&gt;?它应该可以工作...您能否添加更多详细信息?
  • 你不能写这样的约束,但当然你可以设置其他约束来保证类型不能相同,例如如果A必须从类派生AnimalB 必须派生自类Bicycle,如果这两个类都不是从另一个派生的,那么您将知道AB 不能是同一类型,例如@Kobi提示。同样,如果一个具有struct 约束(不可为空的值类型),而另一个具有class 约束(引用类型)。
  • 感谢您的回答。不幸的是,我无法进一步限制参数。泛型类应该适用于任何给定的类型。我想要的唯一限制是typeof(A) != typeof(B)

标签: c# generics


【解决方案1】:

唯一的方法是在运行时。

我根据我在 cmets 中发布的 answer 改编了答案。

public class Test<A, B> {

    static Test() {
        if (typeof(B) == typeof(A)) {
            throw new NotSupportedException("Argument B is not supported.");
        }
    }
}

【讨论】:

  • 这是我目前正在使用的解决方案。它有效,但很讨厌,因为您只能在运行时看到错误。我正在寻找在编译时工作的解决方案。但是,我会将您的帖子标记为答案,因为(目前)似乎没有办法在编译时做出这样的限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
相关资源
最近更新 更多