C# 强制接口的通用约束

C# 强制接口的通用约束,c#,C#,假设我有课 public class A<T>: where T: ISomeInterface {} 公共类A:其中T:接口 {} 是否有约束泛型参数不接受任何类型的接口类型注意,我正在寻找编译时解决方案。我对运行时解决方案不感兴趣。 我想不允许 B: ISomeInterface {} new A<B>(); B:接口 {} 新A(); 但允许并确实要求: new A<ISomeInterface>(); newa(); 是否有约束泛型参数不

假设我有课

public class A<T>: where T: ISomeInterface
{}
公共类A:其中T:接口
{}
是否有约束泛型参数不接受任何类型的接口类型注意,我正在寻找编译时解决方案。我对运行时解决方案不感兴趣。

我想不允许

B: ISomeInterface
{}

new A<B>();
B:接口
{}
新A();
但允许并确实要求:

new A<ISomeInterface>();
newa();
是否有约束泛型参数不接受任何类型的接口类型


不可以。就其性质而言,约束
,其中T:isomoInterface
表示实现
isomoInterface
的任何东西,或者在另一个接口继承该接口的情况下。

如其余部分所述,您不能

我不想提供答案,但在构建时,T作为接口的需要可以在运行时强制执行(硬编码),这显然超出了泛型的目的

public interface IB { }

public class B : IB { }

public class A<T> where T : IB
{
    public A()
    {
        // here it's possible to hardcore all your limitations when constructing, if you like only interfaces 
        if (typeof(T).IsClass)
        {
            throw new InvalidOperationException();
        }
        // or can check what class is not needed if classes implementing interface IB are accepted 
    }
}
公共接口IB{}
公共类B:IB{}
公共A类,其中T:IB
{
公共A()
{
//在这里,如果您只喜欢接口,就可以在构建时强化所有限制
if(类型(T).IsClass)
{
抛出新的InvalidOperationException();
}
//或者,如果接受了实现接口IB的类,则可以检查哪些类是不需要的
}
}
在哪里

//有效
var aib=新的A();
//在运行时失败
var ab=新的A();

就我个人而言,我会限制这是在使用泛型接口而不是类的接口级别。别误会,我可以看到帮助器或扩展类(静态)的泛型类,但它们不应该有任何限制。当具有受限泛型实例化(new)时,一个接口将使您摆脱DI、测试、对象转换和参数传递的麻烦。很少有例子支持我的观点。

这毫无意义。如果你只能传递一个东西作为泛型参数,那有什么意义呢?你要试着解释你想做什么,而不是怎么想achieved@gwow12345这绝对是一个XY问题!因为
B
is-a
isomointerface
,所以它可以在需要
isomointerface
的任何地方使用;这就是多态性的工作原理,不管是泛型的还是其他的。你能展示一下你认为
T
需要的代码吗?我仍然看不出您需要此解决方案的任何原因。您是否可以使用
公共A类
?这样,在声明中就不能使用
接口
的任何实现。但这也排除了子接口。
// works
var aib = new A<IB>();

// fails at runtime
var ab = new A<B>();