ReSharper 2025.2 Help

代码检查:可能的 'System.InvalidCastException' 出现在 foreach 循环中

根据设计, foreach 允许隐式转换为派生类型。 一方面,这使得使用起来很方便,但另一方面,这可能导致运行时异常。

ReSharper 希望您保持安全,因此在检测到不安全的转换(如下面示例中的那种)时,会通知可能的 System.InvalidCastException

public void Foo(IEnumerable<BaseType> list) { // Possible 'System.InvalidCastException' when casting from BaseType to DerivedType foreach (DerivedType item in list) { // do something } }

ReSharper 在此建议的 快速修复帮助您显式地进行转换。 这仍然不安全,但它不再是隐式的:

public void Foo(IEnumerable<BaseType> list) { foreach (var baseType in list) { var item = (DerivedType) baseType; // do something } }

如果转换是有意的,建议用 var 替换显式类型引用。

如果您的集合实现了 IEnumerable ,并且您使用了 DerivedType 中不存在于 BaseType 的成员,您可能需要在迭代之前过滤您的集合。 请注意,这将改变语义:

public void Foo(IEnumerable<BaseType> list) { foreach (DerivedType item in list.OfType<DerivedType>()) { // do something only with objects of DerivedType } }
最后修改日期: 2025年 9月 27日