gpt4 book ai didi

c# - 无法将扩展类转换为 IList

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:38 25 4
gpt4 key购买 nike

给定以下类:

public class MyList<T> : IList<T>, ICloneable
{ ... }

public class PinList : MyList<SomeClass>, ICloneable, IEquatable<PinList>
{ ... }

为什么这行不通?

public void Main()
{
PinList pins = new PinList();
Method2(pins); // Does not work

List<string> strings = new List<string>();
Method2(strings); // WORKS
}

public void Method2(object obj)
{
// returns TRUE
obj.GetType().GetInterfaces().Any(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IList<>));

var things = ((IList)obj).Cast<object>().ToList();
// Unable to cast object of type 'PinList' to type 'System.Collections.IList'.
}

我努力尝试将 obj 转换为 obj.GetType(),但我在谷歌上查找无济于事。

最佳答案

它不会工作,因为你的类没有实现 IList .

  • 它直接实现IList<SomeClass> , ICloneableIEquatable<PinList> .
  • 它间接地 ( via IList<SomeClass> ) 实现了 ICollection<SomeClass> , IEnumerable<SomeClass>IEnumerable .

人们可能会期待 IList<T>实现IList , 但这种情况并非如此。如果您考虑一下,这是有道理的:IList保证可以将任意对象添加到列表中。一个IList<T> , 但是,只允许 T 类型的对象或其要添加的子类型。因此,如果 IList<T>已实现 IList , Liskov substitution principle会被侵犯。

IEnumerable 没有这个问题, 因为无法添加 项目到 IEnumerable .因此,IEnumerable<T>满足 IEnumerable 的所有契约(Contract)满足,因此,IEnumerable<T>工具 IEnumerable .

关于c# - 无法将扩展类转换为 IList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41291508/

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