编译器无法检测到第 3 行会出错:
IList<IList<double>> xs = new List<IList<double>> { new List<double> { 2 } };
IList<string> x0 = xs.First(); // does not compile, as expected
foreach (IList<string> x in xs) { } // works, unexpectedly!
(即使没有错误,Visual Studio 确实在第 3 行建议存在隐式转换,这可能会在运行时失败。)
有趣的是,编译器在这里成功检测到了问题:
IList<double> xs = new List<double> { 2 };
string x0 = xs.First(); // does not compile, as expected
foreach (string x in xs) { } // also does not compile, as expected
第 3 行只给出建议而不是像第 2、5 和 6 行那样给出错误,有充分的理由吗?
foreach
只是 :
try {
while (enumerator.MoveNext()) {
IList<string> x = (IList<string>)enumerator.Current;
}
}
问题归结为 - 这是否是一个编译时错误:
IList<string> x = (IList<string>)enumerator.Current;
根据语言规范中有关允许的显式转换的10.3.5 显式引用转换部分:
从任何接口类型 S 到任何接口类型 T,前提是 S 不是 源自 T.
所以,答案是否定的。