具有有效子类型的接口实现

时间:2016-03-11 23:11:11

标签: c# roslyn

为什么具有更具体类型的方法无法实现具有不太具体的类型的接口?

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

1 个答案:

答案 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。