为什么具有更具体类型的方法无法实现具有不太具体的类型的接口?
public interface IInterface<out T>
{
T GetValues();
}
public class Class : IInterface<object>
{
public Class GetValuesSubType() => null;
//public object GetValues() => GetValuesSubType();
// This won't compile:
public Class GetValues() => null;
}
由于返回相同值的方法是完全有效的代码,只有向上转换。
它是一个设计还是只是一个&#34;缺失&#34;功能?
编辑:
C#7实际上可能支持它:https://github.com/dotnet/roslyn/issues/357
答案 0 :(得分:0)
我认为这是因为您在界面中声明要返回&#39; object&#39;。 在这种情况下,GetValues应该返回&#39; object&#39;不是阶级。
假设我们有班级
public class Class : IInterface
使用Class作为模板参数而不是对象。
然后IL代码如下所示:
.method public final hidebysig newslot virtual
instance class Namespace.Class GetValues () cil managed
我们可以看到&#34; hidebysig&#34;这里。 它被翻译为&#34;隐藏名称和签名&#34;因此,如果您在IInterface中有另一个签名,而另一个在Class中,那么您将没有覆盖,只需添加具有相同名称但不同参数向量的新方法 - 我们不希望如此。
此外,由于接口声明的空槽,继承的类将是抽象的。
有趣的事实: 据我所知,C#中的所有方法都是hidebysig。