Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么C不';实现接口时不允许继承返回类型_C#_.net - Fatal编程技术网

C# 为什么C不';实现接口时不允许继承返回类型

C# 为什么C不';实现接口时不允许继承返回类型,c#,.net,C#,.net,下面的代码在C#中不合法有什么合理的原因吗 签名必须与接口指定的内容完全匹配。没有理由不能从方法返回X的实例,但是方法签名必须使用IB 因为一个合理的原因。。从代码可读性的角度来看,这可能更可取 您可以显式地实现接口,并提供一个替代签名,该签名返回接口未定义的X。如果你知道你的IA实际上是一个X,你可以用它来代替。,因为C#不支持编译时接口的co和contravriance。这样,IA.Test()方法的实现必须与其声明完全匹配。但是,您可以在运行时返回X的实例 public X test();

下面的代码在C#中不合法有什么合理的原因吗


签名必须与接口指定的内容完全匹配。没有理由不能从方法返回
X
的实例,但是方法签名必须使用
IB

因为一个合理的原因。。从代码可读性的角度来看,这可能更可取

您可以显式地实现接口,并提供一个替代签名,该签名返回接口未定义的
X
。如果你知道你的
IA
实际上是一个
X
,你可以用它来代替。

,因为C#不支持编译时接口的co和contravriance。这样,IA.Test()方法的实现必须与其声明完全匹配。但是,您可以在运行时返回X的实例

public X test();
必须为任何非抽象类中的所有方法声明一个主体

试试这个:

class X : IA, IB
{
    public IB test()
    {
        return new X();
    }
}

interface IA
{
    IB test();
}
interface IB { };

您可以使用显式接口实现来避免该问题

class  X : IA, IB
{
  public X test()
  {
    return this;
  }

  IB IA.test()
  {
    return this;
  }
}

interface IA
{
  IB test();
}

interface IB
{
}

更新:这个答案写在2009年。二十年来,人们一直在为C#提出回归型协方差,但现在看来,它最终会实现;我相当惊讶。有关公告,请参见的底部;我相信细节会随之而来


这一特性称为“返回型协方差”。C#不支持它,原因如下:

1) CLR不支持它。为了让它在C#中工作,我们只需要抛出一大堆小助手方法,将返回类型强制转换为正确的类型。没有什么能阻止你自己做那件事

2) 安德斯认为返回型协方差不是一个好的语言特征

3) \我们对该语言有很多更高的优先级。我们只有有限的预算,所以我们尽量只做最好的功能,我们可以在任何给定的版本。当然,这会很好,但是如果你想自己做的话,这很容易。最好是我们花时间添加一些功能,以改善开发人员的体验或为语言添加更多的表示能力。

这会有所帮助
您可以使用“out”关键字

您知道关于#2的其他信息是否可用吗?我喜欢阅读有关语言问题的书籍Brian Gideon对此问题的回答提供了一个示例,说明了如何执行#1。C#4.0的此功能仅支持通用接口和委托。它不会像问题示例中指定的那样工作,因为IA不是一个通用接口,而是一个很好的发现。看见
class  X : IA, IB
{
  public X test()
  {
    return this;
  }

  IB IA.test()
  {
    return this;
  }
}

interface IA
{
  IB test();
}

interface IB
{
}