.net(C#)中的泛型类型参数,其值可以由指定类型之一指定?

.net(C#)中的泛型类型参数,其值可以由指定类型之一指定?,c#,.net,generics,C#,.net,Generics,假设我有类ClassA,ClassB,ClassC。它们都继承自对象,没有一个实现任何接口 在C#中是否可以声明将采用泛型参数T的泛型接口,并且T可以是ClassA或ClassB或ClassC 所以我要的是 public interface MyInterface<T> where T: ClassA | ClassB | ClassC { ... } 公共接口MyInterface其中T:ClassA | ClassB | ClassC{ ... } 如果可能的话,语法

假设我有类
ClassA
ClassB
ClassC
。它们都继承自
对象
,没有一个实现任何接口

在C#中是否可以声明将采用泛型参数
T
的泛型接口,并且
T
可以是
ClassA
ClassB
ClassC

所以我要的是

public interface MyInterface<T> where T: ClassA | ClassB | ClassC {
    ...
}
公共接口MyInterface其中T:ClassA | ClassB | ClassC{
...
}
如果可能的话,语法是什么



注意:我知道我可以让那些类
ClassA
ClassB
ClassC
来实现一些接口,并将其用作
T
的约束,但在我创建一个没有方法的接口之前,我想知道没有更好的方法。

这是不可能的,因为类型必须满足所有约束,而不仅仅是一个约束。
无论如何,如果您的接口中没有一个方法,这意味着您的类没有任何共同点。那么,您将如何在通用方法中使用它们呢?

我认为你错过了一些重要的事情,或者没有告诉我们整个故事。

没有更好的办法了

只能指定一个基类或接口作为该约束

但是让我问你,如果这三个类没有共同点,为什么你要限制它们?既然您说您可以约束到一个没有方法的接口,那么您实际上从这些类中使用了什么


对于接口约束,您只知道所使用的对象实现了该接口。

不,您不能。通用约束目前相当有限


除了类型层次结构之外,它们不允许任何东西,它不是引用类型,也不是具有公共无参数的构造函数。

除非您希望更改编程语言,否则答案不是答案,但是F#允许比C#更大程度地控制通过使用,最多包括“显式成员约束”,它是有效的静态类型

它还允许以不同的方式为您解决问题


所有这些都表明.net运行时确实支持这类功能,但在C语言中没有简单的语法。

对于“非类”int | long将是一个“良好且有效”的限制。@xanatos:我不太确定。对于编译器来说,它们仍然是两种不同的类型。我的意思是“有用”,而不是“有效”。您不能将泛型类限制为“数字”(具有+、-、*、/定义的实体)这一事实是.NET的已知限制,我的意思是在.NET中实现泛型的方式“几乎不可能”。因为,您真正需要做的是定义已实现运算符的约束,如果您想这样做,即“所有实现+和-”的类@Daniel Hilgarth我当然没有告诉您整个故事。。。他们有一些共同点,但这不是一种方法。。。请看我对@Lasse V.Karlsen的回答的评论。我知道这看起来很奇怪,但他们实际上有一些共同点,但这不是方法。事实上,它们都是表示数据库中表的POCO类。编译器不知道这一点,这就是您必须告诉它的。实现接口。我知道“标记接口”在其他地方是不受欢迎的,FxCop和其他地方一样,但在这种情况下,真的没有其他方法,除非你完全抛弃约束,而是添加运行时检查(如果你能做到的话)。@drasto:这意味着什么?请给出一个示例,说明您希望如何在方法中使用这些类+1好答案,好知识,但没有解决方案。我不打算仅仅因为一个接口而学习J#语法,也不打算因为我想在J#中有一个接口而拥有另一个项目,这对我来说似乎不是个好主意。@drasto如前所述,这并不是针对您的具体情况的答案:更值得注意的是,答案在未来可能存在!在C#中有一些实现歧视联合的方法,但由于没有语法支持,它们都涉及许多不令人满意的问题。