如何在foreach中隐式转换自定义IEnumerable?

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可以隐式强制转换其他,为什么这对我的自定义类不起作用?

Mar*_*ell 7

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)