foreach on C#中的泛型类型

时间:2016-10-12 17:13:23

标签: c# generics

给出以下结构:

struct Foo : IEnumerable<int>, IEnumerable<string> {
    public IEnumerator<int> GetEnumerator() { yield return 1; }
    public IEnumerator<string> IEnumerable<string>.GetEnumerator() {
        yield return "One"
    }
    public IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

以及以下通用方法:

void Bar<TEnum, T>(TEnum iterable) where TEnum : IEnumerable<T> {
    foreach (T item in iterable) Console.WriteLine(item);
}

我尝试了以下内容:

Foo foo = new Foo();
Bar<Foo, int>(foo); //prints 1
Bar<Foo, string>(foo); //prints One (How does this work)
foreach(int i in foo) Console.WriteLine(i); //prints 1
foreach (string s in foo) Console.WriteLine(s); 
// Error: connot convert from string to int

现在我的问题是:编译器生成什么代码,何时将这些泛型评估为某种类型?通用类型的AFAIK将被替换为具体类型。但是从上面可以看出,这对于这个例子不起作用。那么编译器如何在foreach中选择正确的类型呢?我唯一的猜测就是它会增加一个演员阵容。即:

foreach(string item in (IEnumerable<string>)iterable) ...

但是我选择声明这样的方法来避免演员表。否则我可以这样做:

void Bar<T>(IEnumerable<T> iterable) { ... }

所以我真的希望它能在不投射的情况下发挥作用......

编辑:我的问题不是为什么我在最后一个foreach中得到错误(我知道我不能直接在类型上访问显式接口实现),但是它如何在泛型方法中工作,AFAIK应该评估与上一个foreach完全相同的代码。

0 个答案:

没有答案