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

时间:2019-06-05 12:26:27

标签: c# casting ienumerable

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

1 个答案:

答案 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();