mkl*_*uwe 6 c# generics interface
请考虑以下界面:
public interface IFoo
{
M Bar<M>();
}
Run Code Online (Sandbox Code Playgroud)
试着用它来实现
class Foo : IFoo
{
public M Bar<M>()
{
return new M();
}
}
Run Code Online (Sandbox Code Playgroud)
不起作用,编译器抱怨M
缺少一个new()
约束.
当我添加约束时
class Foo : IFoo
{
public M Bar<M>() where M : new()
{
return new M();
}
}
Run Code Online (Sandbox Code Playgroud)
这仍然不能解决问题,因为Foo.Bar
现在的约束与接口方法的约束不匹配(而且我无法改变它).
要避免此错误,请确保两个声明中的where子句相同,或明确实现接口.
如果"明确地实现接口"是解决方案:我该怎么做?
如果您无法更改界面定义,则必须避免使用new M();
- 请Activator.CreateInstance
改用:
class Foo : IFoo
{
public M Bar<M>()
{
return Activator.CreateInstance<M>();
}
}
Run Code Online (Sandbox Code Playgroud)
当然,如果没有无参数构造函数,您现在可能会遇到运行时错误M
,但这是不可避免的(同样,因为我们无法更改泛型约束).
回复:文档:
明确地实现接口.
我认为他们试图在这里得到的是"如果你有一个基类方法,它有一组通用约束,你想要实现一个具有不同约束条件的接口,对于一个具有相同方法的方法name,显式实现是该绑定的一种方法".
明确地实现接口不是解决方案.编译器只是告诉你,如果你需要一个Bar
带有该约束的泛型方法,那么明确地实现接口,这样两个版本的Bar
可以共存,但显然,这不是你所期待的解决方案.
唯一的解决方案是:
M
反射:Activator.CreateInstance
并在编译时支付丢失类型安全的代价; 没有强制M
要求无参数构造函数.