C# 编译器在应该出错时却失败了

问题描述 投票:0回答:1

编译器无法检测到第 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 行那样给出错误,有充分的理由吗?

c# generics compiler-errors
1个回答
0
投票

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.

所以,答案是否定的。

© www.soinside.com 2019 - 2024. All rights reserved.