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 时相同的错误。
循环foreach具有到目标类型的内置显式转换。
这就是为什么你可以写:
\nobject[] things = ...\n\nforeach(string s in things)\n{\n // ...\n}\nRun Code Online (Sandbox Code Playgroud)\n您可以在 C# 语言规范 8.8.4 中看到这一点:
\n8.8.4 foreach 语句
\nforeach (V v in x) embedded-statement\nRun Code Online (Sandbox Code Playgroud)\n然后扩展为:
\nE 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}\nRun Code Online (Sandbox Code Playgroud)\n因此它的工作方式与您编写的方式相同:
\ndouble d = 123.45;\nint i = (int) d;\nRun Code Online (Sandbox Code Playgroud)\n