List <t>。抛出System.IndexOutOfRangeException </t>

时间:2012-04-02 20:09:23

标签: c# generics

我在List.Find()上遇到System.IndexOutOfRangeException。问题是它不一致,并且只在生产环境中发生。浏览List.Find(Predicate match) method的MSDN文档,但它确实说明索引超出范围异常。在什么情况下会从List.Find()方法抛出System.IndexOutOfRangeException?

这是在ASP.Net应用程序中发生的。代码在静态方法中,如下所示:

private static T GetReflectionInfo<T>(object obj, string memberName) where T :    System.Reflection.MemberInfo
{
    var knownInfos = new List<MemberInfo>();
    /// populate the list
    /// this line is where the exception is thrown. T is the generic type passed in.
    T info = (T) knownInfos.Find(item => item is T && item.Name.EqualsIgnoreCase(memberName));
}

[更新] - 其中一个节点出现了问题。感谢您的回答和评论。

1 个答案:

答案 0 :(得分:6)

如果在Find正在运行时修改List(特别是删除项目),则可能会抛出它。根据{{​​3}},这是不允许的(强调我的):

  

线程安全

     

公共静态(在Visual Basic中为Shared)成员   类型是线程安全的。不保证任何实例成员   线程安全。

     

List(Of T)可以同时支持多个读者,只要   集合未修改 。列举一个集合是   本质上不是一个线程安全的程序。在罕见的情况下   枚举与一个或多个写访问争用,唯一的方法   确保线程安全是在整个过程中锁定集合   列举。允许多个访问集合   阅读和写作的线程,你必须实现自己的   同步。