我清楚地了解到使用C#编译器处理
但是对我来说不清楚的是,为什么C#编译器将
foreach
语句时所采用的基于模式的方法"Pattern-based" approach。从C#语言规范(第8.8.4节)中可以明确得知,首先C#编译器会尝试查找GetEnumerator
方法,然后才会查找IEnumerable<T>
和IEnumerable
接口。但是对我来说不清楚的是,为什么C#编译器将
string
单独处理(因为String
类包含一个返回CharEnumerator
的GetEnumerator
方法,并且它还实现了IEnumerable<char>
和IEnumerable
接口)。string s = "1234";
foreach(char c in s)
Console.WriteLine(c);
转换为
string s = "1234";
for(int i = 0; i < s.Length; i++)
Console.WriteLine(s[i]);
但我在语言规范中找不到关于String
类的任何异常。有人能给出这个解决方案的一些见解吗?
我尝试使用C# 4编译器。以下是先前代码片段的IL代码:
IL_0000: ldstr "1234"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: stloc.2
IL_0008: ldc.i4.0
IL_0009: stloc.3
IL_000A: br.s IL_001E
IL_000C: ldloc.2
IL_000D: ldloc.3
IL_000E: callvirt System.String.get_Chars
IL_0013: stloc.1
IL_0014: ldloc.1
IL_0015: call System.Console.WriteLine
IL_001A: ldloc.3
IL_001B: ldc.i4.1
IL_001C: add
IL_001D: stloc.3
IL_001E: ldloc.3
IL_001F: ldloc.2
IL_0020: callvirt System.String.get_Length
IL_0025: blt.s IL_000C