如何在 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();