gpt4 book ai didi

c# - 将子类的枚举器强制转换为父类的枚举器是否错误?

转载 作者:行者123 更新时间:2023-11-30 14:21:06 31 4
gpt4 key购买 nike

我的构建中出现错误:

Error 12 Cannot implicitly convert type 'System.Collections.Generic.IEnumerator< BaseClass>' to 'System.Collections.Generic.IEnumerator< IParentClass>'. An explicit conversion exists (are you missing a cast?)

简单地丢弃它是错误的吗?

这是我的代码:

public Dictionary<Int32, BaseClass> Map { get; private set; }

public IEnumerator<BaseClass> GetEnumerator()
{
return this.Map.Values.GetEnumerator();
}

public IEnumerator<IParentClass> IEnumerable<IParentClass>.GetEnumerator()
{
return this.GetEnumerator(); // ERROR!
}

我的问题是,我可以只更改这一行吗:

return this.GetEnumerator();

到:

return (IEnumerator<IParentClass>)this.GetEnumerator();

(没有任何不良副作用)?

接受的答案:
我已将函数更改为以下内容(在阅读 Jon Skeet 的帖子后):

IEnumerator<IParentClass> IEnumerable<IParentClass>.GetEnumerator()
{
return this.Map.Values.Cast<IParentClass>().GetEnumerator();
}

最佳答案

不,你不能,因为泛型目前在 C# 中不是协变的。 .NET 本身有一些支持(对委托(delegate)和接口(interface)),但尚未真正使用。

如果您要返回 IEnumerable<BaseClass>而不是 IEnumerator<BaseClass> (假设是 .NEt 3.5)你可以使用 Enumerable.Cast - 但您目前需要编写自己的扩展方法,例如

public static IEnumerator<TParent> Upcast<TParent, TChild>
(this IEnumerator<TChild> source)
where TChild : TParent
{
while (source.MoveNext())
{
yield return source.Current;
}
}

或者,在您的情况下,您可以更早地使用 Cast:

return this.Map.Values.Cast<BaseClass>().GetEnumerator();

关于c# - 将子类的枚举器强制转换为父类的枚举器是否错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/229656/

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