C# 泛型参数:确保不同的类型

C# 泛型参数:确保不同的类型,c#,generics,C#,Generics,我有一个具有两个泛型参数的类。我想将第二个泛型参数限制为与第一个不同的类型。有没有办法在编译时进行这样的限制?在运行时检查类型不是很有用 public class Test<A, B> where B : not_typeof(A) { // ... } 公共类测试 式中B:not_typeof(A) { // ... } 唯一的方法是在运行时 我根据我在评论中发表的文章改编了答案 public class Test<A, B> { stati

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

public class Test<A, B>
    where B : not_typeof(A)
{
    // ...
}
公共类测试
式中B:not_typeof(A)
{
// ...
}

唯一的方法是在运行时

我根据我在评论中发表的文章改编了答案

public class Test<A, B> {

    static Test() {
        if (typeof(B) == typeof(A)) {
            throw new NotSupportedException("Argument B is not supported.");
        }
    }
}
公共类测试{
静态测试(){
if(类型(B)=类型(A)){
抛出新的NotSupportedException(“不支持参数B”);
}
}
}

事实上,这是一个稍有不同的场景,但最终答案与@Sam links的答案相同。您还有其他限制吗?因为当你有
where A:IUtensil
where B:IVehicle
,你为什么要关心用户是否有
测试?它应该有用。。。您可以添加一些详细信息吗?您不能编写这样的约束,但您当然可以添加其他约束,以保证类型不能相同,例如,如果
a
必须派生自类
Animal
,而
B
必须派生自类
Bicycle
,如果这两个类都不是从另一个派生的,那么你就会知道
A
B
不能是相同的类型,就像@Kobi提示的那样。同样,如果一个具有
struct
约束(不可为空的值类型),另一个具有
class
约束(参考类型)。感谢您的回答。不幸的是,我不能进一步限制参数。泛型类应该与给定的任何类型一起工作。我想要的唯一限制是
typeof(A)!=typeof(B)
。这是我目前正在使用的解决方案。它可以工作,但很糟糕,因为您只能在运行时看到错误。我正在寻找一种在编译时工作的解决方案。不过,我会将您的帖子标记为答案,因为(目前)似乎没有办法在编译时进行这样的限制。