如何在 foreach 中隐式转换自定义 IEnumerable?
How to implicitly cast custom IEnumerable in foreach?
我希望 foreach
循环中的 var
隐式转换自定义 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
可以隐式转换,为什么这对我的自定义 class 不起作用?
foreach
是一个有趣的野兽——只要有可能它就是 duck-typed(意思是:它实际上并不需要 IEnumerable[<T>]
API 如果 public {something} GetEnumerator()
方法存在),在您的情况下,public
方法是 non-generic 方法。所以...反过来说:
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();
我希望 foreach
循环中的 var
隐式转换自定义 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
可以隐式转换,为什么这对我的自定义 class 不起作用?
foreach
是一个有趣的野兽——只要有可能它就是 duck-typed(意思是:它实际上并不需要 IEnumerable[<T>]
API 如果 public {something} GetEnumerator()
方法存在),在您的情况下,public
方法是 non-generic 方法。所以...反过来说:
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();