【问题标题】:IEnumerable<> to List<> Cannot Resolve symbol AddIEnumerable<> 到 List<> 无法解析符号添加
【发布时间】:2014-12-06 19:08:34
【问题描述】:

我对实现具有其他接口类型列表的接口的类有疑问。尝试在下面创建一个简单的示例。

    public interface IPerson
{
    IEnumerable<IPersonEntry> Persons { get; set; }
    DateTime LastUpdated { get; set; }
}

public class PersonType1 : IPerson
{
    public IEnumerable<IPersonEntry> Persons { get; set; }
    public DateTime LastUpdated { get; set; }

    public PersonType1()
    {
        Persons = new List<NormalEntry>();
    }
}

public class PersonType2 : IPerson
{
    IEnumerable<IPersonEntry> Persons { get; set; }
    public DateTime LastUpdated { get; set; }

    public PersonType2()
    {
        Persons = new List<SomethingDifferent>();
    }
}

public interface IPersonEntry
{
    string Name { get; set; }
}

public class NormalEntry : IPersonEntry
{
    // some other props

}

public class SomethingDifferent  : IPersonEntry
{
    // something different
}

public class SomeOtherClass
{
    public SomeMethod()
    {
        PersonType2 p2 = new PersonType2();
        p2.Persons.Add(new SomethingDifferent{
            // blah = 5;
        })

    }
}

但在我的 SomeOtherClass 方法中,我希望能够添加到列表中,但它仍然被视为 IEnumerable 而不是 List。所以我不能添加它。任何帮助将不胜感激。

【问题讨论】:

  • 不允许将interface 中的属性定义为public

标签: c# .net class interface


【解决方案1】:

您不能添加到IEnumerable&lt;T&gt;IList&lt;T&gt;中定义了add方法,所以你需要改变你的参数类型:

IList<IPersonEntry> Persons { get; set; }

【讨论】:

  • 或者,在PersonType2 类中使用Add 方法,或者在SomeOtherClass 中强制转换为List&lt;IPersonEntry&gt;
  • 哦,太好了。如果我更改为 IList,我会收到一个错误,我无法将 IList 转换为 List 或其他任何类型。
  • @MatthewTheTerrible 这是经典的协方差问题。见this question
  • 那么有没有更好的方法来解决这个问题?
  • 您试图违反类型安全。为什么要将 SomethingDifferent 添加到 NormalEntry 类型的列表中?如果您解释您要达到的目标,我可以提出更好的解决方案。
【解决方案2】:

补充 Selman22 的答案:关键是 PersonType2.Persons 的公开可见定义是 IEnumerable,因此它必须像 IEnumerable 一样对待 - 即使您选择 List 作为它的实现.正如 Selman 所说,你不能添加到可枚举中。

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多