您可能知道,C#中的数组实现IList<T>了其他接口.但不知何故,他们这样做没有公开实现Count属性IList<T>!数组只有一个Length属性.
这是一个明显的例子,C#/ .NET打破了自己关于接口实现的规则,还是我错过了什么?
给出以下C#代码:
int[,] array2D = new int[10, 10];
int sum = 0;
foreach (var i in array2D)
{
sum += i;
}
Run Code Online (Sandbox Code Playgroud)
问题是:是什么导致类型i被正确推断为int?
这并不是一件容易的事,因为array2D是一个矩形阵列.它没有实现IEnumerable<int>.它还实现了一个GetEnumerator()返回a 的方法System.Collections.IEnumerator.因此,我希望这种i类型object.
我的代码使用的是.net 4.03.
所以我注意到这段代码有效:
class Program
{
public static void Main()
{
Int32[ ]numbers = {1,2,3,4,5};
using (var enumerator = Data().GetEnumerator())
{
}
}
public static IEnumerable<String> Data()
{
yield return "Something";
}
}
Run Code Online (Sandbox Code Playgroud)
特别是,我对using块感到好奇,因为:
Int32[] numbers = { 1, 2, 3, 4, 5, 6 };
using (var enumerator = numbers.GetEnumerator())
{
}
Run Code Online (Sandbox Code Playgroud)
因编译器错误而失败.显然,yield return返回的类是IDisposable常规数组枚举器不是.所以现在我很好奇:yield return创造了什么?