gpt4 book ai didi

c# - 返回派生类型时为 "Interface not implemented"

转载 作者:IT王子 更新时间:2023-10-29 04:01:16 27 4
gpt4 key购买 nike

以下代码:

public interface ISomeData
{
IEnumerable<string> Data { get; }
}

public class MyData : ISomeData
{
private List<string> m_MyData = new List<string>();
public List<string> Data { get { return m_MyData; } }
}

产生以下错误:

error CS0738: 'InheritanceTest.MyData' does not implement interface member 'InheritanceTest.ISomeData.Data'. 'InheritanceTest.MyData.Data' cannot implement 'InheritanceTest.ISomeData.Data' because it does not have the matching return type of 'System.Collections.Generic.IEnumerable'.

由于 List 实现了 IEnumerable ,人们会认为我的类将实现该接口(interface)。有人可以解释不编译的理由是什么吗?

据我所知,有两种可能的解决方案:

  1. 将接口(interface)更改为更具体并要求实现 IList。
  2. 更改我的类 (MyData) 以返回 IEnumerable 并实现原始接口(interface)。

现在假设我还有以下代码:

public class ConsumerA
{
static void IterateOverCollection(ISomeData data)
{
foreach (string prop in data.MyData)
{
/*do stuff*/
}
}
}

public class ConsumerB
{
static void RandomAccess(MyData data)
{

data.Data[1] = "this line is invalid if MyPropList return an IEnumerable<string>";
}
}

我可以更改我的接口(interface)以要求实现 IList(选项 1),但这限制了谁可以实现该接口(interface)以及可以传递给 ConsumerA 的类的数量。或者,我可以更改实现(MyData 类),以便它返回 IEnumerable 而不是 List(选项 2),但这样就必须重写 ConsumerB。

这似乎是C#的一个缺点,除非有人能赐教。

最佳答案

不幸的是,返回类型必须匹配。您正在寻找的称为“返回类型协方差”,而 C# 不支持它。

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=90909

C# 编译器团队的高级开发人员 Eric Lippert 在他的博客中提到他们不打算支持返回类型协变。

"That kind of variance is called "return type covariance". As I mentioned early on in this series, (a) this series is not about that kind of variance, and (b) we have no plans to implement that kind of variance in C#. "

http://blogs.msdn.com/ericlippert/archive/2008/05/07/covariance-and-contravariance-part-twelve-to-infinity-but-not-beyond.aspx

Eric 关于协变和逆变的文章值得一读。

http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx

关于c# - 返回派生类型时为 "Interface not implemented",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1121283/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com