C#:循环遍历 IEnumerable<double> 的 int 不会导致转换错误

Seb*_*ers 5 c# ienumerable casting

以下代码在 Visual Studio 中导致 CS0266:

double x = 1.23;
int y = x;
Run Code Online (Sandbox Code Playgroud)

但以下代码在 Visual Studio 中编译,并导致隐式将 double 强制转换为 int:

double x = 0;
ReadOnlyCollection<double> y = new ReadOnlyCollection<double>(new double[3] { 1.23, 2.34, 3.45 });
foreach (int z in y)
{
   x += z;
}
Run Code Online (Sandbox Code Playgroud)

为什么会受到不同的对待?我会导致编译失败吗?

我预计在循环 IEnumerable 时隐式转换为 int 会导致与将 double 转换为 int 时相同的错误。

Tim*_*ter 9

循环foreach具有到目标类型的内置显式转换。

\n

这就是为什么你可以写:

\n
object[] things = ...\n\nforeach(string s in things)\n{\n    // ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

您可以在 C# 语言规范 8.8.4 中看到这一点:

\n

8.8.4 foreach 语句

\n
foreach (V v in x) embedded-statement\n
Run Code Online (Sandbox Code Playgroud)\n

然后扩展为:

\n
E e = ((C)(x)).GetEnumerator();\ntry {\n    V v;\n    while (e.MoveNext()) {\n        v = (V)(T)e.Current;\n        embedded-statement\n    }\n}\nfinally {\n    \xe2\x80\xa6 // Dispose e\n}\n
Run Code Online (Sandbox Code Playgroud)\n

因此它的工作方式与您编写的方式相同:

\n
double d = 123.45;\nint i = (int) d;\n
Run Code Online (Sandbox Code Playgroud)\n