繁体   English   中英

实现缺少新约束的通用接口

[英]Implement a generic interface missing new constraint

请考虑以下界面:

public interface IFoo
{
    M Bar<M>();
}

试着用它来实现

class Foo : IFoo
{
    public M Bar<M>()
    {
        return new M();
    }
}

不起作用,编译器抱怨M缺少new()约束。

当我添加约束时

class Foo : IFoo
{
    public M Bar<M>() where M : new()
    {
        return new M();
    }
}

这仍然不能解决问题,因为Foo.Bar的约束现在与接口方法的约束不匹配(而且我无法改变它)。

编译器错误CS0425文档

要避免此错误,请确保两个声明中的where子句相同,或明确实现接口。

如果“明确地实现接口”是解决方案:我该怎么做?

如果您无法更改接口定义,则必须避免使用new M(); - 改用Activator.CreateInstance

class Foo : IFoo
{
    public M Bar<M>()
    {
        return Activator.CreateInstance<M>();
    }
}

当然,如果M没有无参数构造函数,您现在可能会遇到运行时错误,但这是不可避免的(同样,因为我们无法更改泛型约束)。


回复:文档:

明确地实现接口。

认为他们试图在这里得到的是“如果你有一个基类方法,它有一组通用约束,你想要实现一个具有不同约束条件的接口,对于一个具有相同方法的方法name,显式实现是该绑定的一种方法“。

明确地实现接口不是解决方案。 编译器只是告诉你,如果你需要一个具有该约束的泛型方法Bar ,那么显式地实现接口,这样两个版本的Bar可以共存,但显然,这不是你所期待的解决方案。

唯一的解决方案是:

  1. 在接口中实现泛型类型约束。
  2. 通过反射实例化新的MActivator.CreateInstance并在编译时支付丢失类型安全的代价; 没有强制M有一个无参数的构造函数。

您可以通过右键单击类中的接口来生成显式接口实现,该接口应该实现它并选择“明确实现”。 方法名称应该用接口名称来表示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM