代码检查:可能的 '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日