我希望var
循环中的foreach
隐式转换自定义IEnumerable
的项目。它在内部Dictionary
上循环,并且主要是包装器。我尝试了通用和非通用IEnumerable
。
我想了解在foreach
循环中支持隐式强制转换所需要的内容。
public class Bewerbung : IEnumerable<KeyValuePair<string, string>>
{
protected Dictionary<string, string> internDic = new Dictionary<string, string>();
public IEnumerator GetEnumerator()
{
return internDic.GetEnumerator();
}
IEnumerator<KeyValuePair<string, string>> IEnumerable<KeyValuePair<string, string>>.GetEnumerator()
{
return internDic.GetEnumerator() ;
}
}
var bewerbung = new Bewerbung();
foreach (var testi in bewerbung)
{
}
testi
始终是对象,而不是KeyValuePair
。
我知道我可以使用显式强制转换进行实际使用,但是我想了解我的方法有什么问题。其他IEnumerable
可以被隐式转换,为什么这对我的自定义类不起作用?
答案 0 :(得分:7)
foreach
是一种有趣的野兽-只要有可能,它都是鸭子类型的(意思是:如果存在IEnumerable[<T>]
方法,它实际上不需要public {something} GetEnumerator()
API),并且在您的在这种情况下,public
方法是非通用方法。所以...反向:
IEnumerator IEnumerable.GetEnumerator()
{
return internDic.GetEnumerator();
}
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
{
return internDic.GetEnumerator();
}
还要注意,通常将显式实现代理到public
上,以避免维护错误,即
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
=> internDic.GetEnumerator();
如果要对此进行优化,甚至可以公开自定义词典枚举器:
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
IEnumerator<KeyValuePair<string, string>> IEnumerable<KeyValuePair<string, string>>.GetEnumerator()
=> GetEnumerator();
public Dictionary<string, string>.Enumerator GetEnumerator()
=> internDic.GetEnumerator();