gpt4 book ai didi

c# - 在 C# 中返回一个列表

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:45 26 4
gpt4 key购买 nike

根据有关使用 IEnumerable 而不是 List 的初步建议进行编辑。

我正在尝试这样做:

public interface IKPIDetails // Previously: interface IKPIDetails
{
string name {get; set;}
//...
}


public abstract class BaseReport
{
public List<IKPIDetails> m_KPIDetails; // Previously: list<IKPIDetails> m_KPIDetails;

public BaseReport()
{
m_KPIDetails = MakeReportDataStructure();
//...
}
public abstract List<IKPIDetails> MakeReportDataStructure(); // Previously: public abstract IKPIDetails MakeReportDataStructure();

//...
}


public class AirTemp_KPIDetails : NetVisSolution.Reports.IKPIDetails // Previously: protected class AirTemp_KPIDetails : IKPIDetails
{
#region IKPIDetails implementation
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
#endregion
...
}

public class SSAirTempSummaryReport : BaseReport
{
public SSAirTempSummaryReport() : base ()
{
// Do any extra initialisation here
m_reportName = "Air Temperature Summary Report";
}

//It now complains on the declaration below at the word
// MakeReportDataStructure()
public override IEnumerable<IKPIDetails> MakeReportDataStructure() // Previously: public override List<IKPIDetails> MakeReportDataStructure()
{
List<AirTemp_KPIDetails> d = new List<AirTemp_KPIDetails>();
return d; // <-- this is where it used to break
}

//...
}

所以我有一个报告数据对象接口(interface)和可能实现此接口(interface)并添加其特定额外位的多个报告数据类。我有一个实现通用报告功能的抽象报告类和多个派生类,每个派生类都使用自己的报告数据类。

不幸的是,当我尝试在派生类中创建我的报告详细结构列表并将其作为接口(interface)列表传递回基类时,它会提示:

Cannot implicitly convert type 
'System.Collections.Generic.List<NetVisSolution.Reports.AirTemp_KPIDetails>' to
'System.Collections.Generic.List<NetVisSolution.Reports.IKPIDetails>'

它不会让我隐式或显式地这样做。有什么办法可以做到这一点吗?

提前致谢

--- 阿利斯泰尔。

最佳答案

public override List<IKPIDetails> MakeReportDataStructure()
{
List<AirTemp_KPIDetails> d = new List<AirTemp_KPIDetails>();
return d; // <-- this is where is breaks
}

应该是:

public override List<IKPIDetails> MakeReportDataStructure()
{
List<IKPIDetails> d = new List<AirTemp_KPIDetails>();
return d;
}

您的作业无效,因为在 List<T> 中, 类型参数 T不是协变的,即当T时不允许赋值更具体。你应该使用 IEnumerable ,您的代码可以正常工作:

public override IEnumerable<IKPIDetails> MakeReportDataStructure()
{
List<AirTemp_KPIDetails> d = new List<AirTemp_KPIDetails>();
return d; // <-- works, because T in IEnumerable is covariant
}

你可能会问,为什么IEnumerable是协变的?嗯,IEnumerable只允许您读取数据(因此协方差标记为 <out T> ),并且您不能将任何对象写入其中。 List 允许您将对象写入集合,但您会遇到稍后向该集合写入不太具体的类型的危险,这可能会导致错误,因为不太具体的类型不提供与更派生的类型相同的功能:

public override IEnumerable<BaseClass> MakeList()
{
List<DerivedClass> d = new List<DerivedClass>();
// ...
return d; // assume it would work
}

var l = MakeList();
l.Add(BaseClass); // now we added object of BaseClass to the list that expects object of DerivedClass, any operation on the original list (the one with List<DerivedClass> type could break

关于c# - 在 C# 中返回一个列表<interface>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12476284/

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