C.J*_* DJ 2 c# ienumerable casting
我希望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() ;
}
}
Run Code Online (Sandbox Code Playgroud)
var bewerbung = new Bewerbung();
foreach (var testi in bewerbung)
{
}
Run Code Online (Sandbox Code Playgroud)
testi始终是一个对象,而不是KeyValuePair应当的对象。
我知道我可以将显式转换用于实际用途,但是我想了解我的方法有什么问题。IEnumerable可以隐式强制转换其他,为什么这对我的自定义类不起作用?
foreach是一种有趣的野兽-只要有可能,它都是鸭子类型的(意味着:IEnumerable[<T>]如果public {something} GetEnumerator()存在一种方法,它实际上并不需要API ),并且在您的情况下,该public方法是非泛型的。所以...逆转:
IEnumerator IEnumerable.GetEnumerator()
{
return internDic.GetEnumerator();
}
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
{
return internDic.GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)
还要注意,通常将显式实现代理到public一个,以避免维护错误,即
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
=> internDic.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)
如果要对此进行优化,甚至可以公开自定义词典枚举器:
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
IEnumerator<KeyValuePair<string, string>> IEnumerable<KeyValuePair<string, string>>.GetEnumerator()
=> GetEnumerator();
public Dictionary<string, string>.Enumerator GetEnumerator()
=> internDic.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |