在C#中,当一次使用在基构造函数调用中时,如何解决多重枚举警告?

在C#中,当一次使用在基构造函数调用中时,如何解决多重枚举警告?,c#,ienumerable,base,C#,Ienumerable,Base,以下代码对IEnumerable的可能多重枚举给出了警告: public ClassName(IEnumerable<OtherClassName> models) : base(models) { _models.AddRange(models); } public类名(IEnumerable模型):基本(模型) { _模型。添加范围(模型); } 由于“基本”调用,用于删除此警告的常规解决方案不起作用。我无法转换为列表,因为没有地方存储该列表 我唯一的选择是让构造函数

以下代码对IEnumerable的可能多重枚举给出了警告:

public ClassName(IEnumerable<OtherClassName> models) : base(models)
{
    _models.AddRange(models);
}
public类名(IEnumerable模型):基本(模型)
{
_模型。添加范围(模型);
}
由于“基本”调用,用于删除此警告的常规解决方案不起作用。我无法转换为列表,因为没有地方存储该列表


我唯一的选择是让构造函数将列表作为参数吗?在这种情况下,这是推荐的做法吗?

创建另一个私有构造函数,它接受
列表
,并使用
this
关键字调用它:

public ClassName(IEnumerable<OtherClassName> models)
    : this(models.ToList())
{
}

private ClassName(List<OtherClassName> models)
    : base(models)
{
    _models.AddRange(models);
}
公共类名(IEnumerable模型)
:此(models.ToList())
{
}
私有类名(列出模型)
:基本(型号)
{
_模型。添加范围(模型);
}

并确保您确实需要在类中存储
模型
。可能它已经存储在
base
类中,您可以从那里使用它?

基类将已经存储
模型
。为什么需要
\u models.AddRange(models)?a)我需要/希望存储在本地,因为尽管父类确实存储,但它存储为基类,并且我希望在本地使用它时避免向下转换。b) 这不是那个问题的翻版。简单而伟大的答案事实上,这个答案已经变成了一个问题。它正在创建枚举的额外副本。当列表变得非常大时,额外的列表就有点问题了。有两个副本(一个在父类中,一个在子类中),很好,但是有三个副本——临时创建只是为了调用基类——这是一个问题。我不确定我们将如何重构来处理它,但我想在这里记录,虽然这是一个解决一般问题的好方法,但它确实有缺点。