【发布时间】:2009-06-04 10:44:01
【问题描述】:
想象一下下面的代码:
class foreach_convert
{
public static void method2()
{
List<IComparable> x = new List<IComparable>();
x.Add(5);
foreach (string s in x)
{
//InvalidCastException in runtime
}
}
}
我想知道,为什么这种 foreach 行为如此......不像 C#? 这里发生的是对子类的隐式强制转换,这很容易出错,并且似乎在该语言的所有其他地方都被禁止。还是我说的不对?
附:我问的原因是我的项目中的类似代码中有一个错误,我曾经在其中迭代来自外部库的自定义集合,它被称为SomeTypeCollection,但实际上提供了一个基础集合键入项目并且可能包含 SomeOtherType 的项目。我的错,但语言和编译器仍然没有提供任何明确的提示/警告,这对于 C# 来说是非常不寻常的......
【问题讨论】:
-
嘿,当我希望(不是真的期望)foreach 会根据对象的类型隐式过滤集合中的对象时,我第一次遇到了这个问题。想想它是怎么读的,“对于集合中的每个字符串”。对我来说,这读起来就像,“对于集合中的所有字符串,做一些事情。”然后它将忽略任何不是字符串的内容。
-
历史记录:分析器被 dotnet/runtime 团队拒绝:github.com/dotnet/roslyn-analyzers/issues/4479
-
更新:新的
IDE0210分析器是created to detect this,将在VS2022 17.3中引入
标签: c# foreach language-design