C# Can Linq.Contains THOW“包含抛出”;收集被修改;枚举操作不能执行;例外?

C# Can Linq.Contains THOW“包含抛出”;收集被修改;枚举操作不能执行;例外?,c#,linq,exception,collections,dictionary,C#,Linq,Exception,Collections,Dictionary,我有以下代码向字典中添加了一些值。CanLinq.Containsmethods抛出System.InvalidOperationException“集合已修改;枚举操作可能无法执行。”何时将项添加到字典 private static object _lock = new object(); private static Dictionary<Type, A> _dic = new Dictionary<Type, A>(); public static AddNewV

我有以下代码向字典中添加了一些值。Can
Linq.Contains
methods抛出
System.InvalidOperationException
“集合已修改;枚举操作可能无法执行。”
何时将项添加到字典

private static object _lock = new object();
private static Dictionary<Type, A> _dic = new Dictionary<Type, A>();

public static AddNewValue(Type t, A value)
{
    if ( !_dic.Keys.Contains( t ) )
    {
        lock ( _lock )
        {
            if ( !_dic.Keys.Contains( t ) )
            {
                _dic.Add( t, value );
            }
        }
    }
}
private static object_lock=new object();
私有静态字典_dic=新字典();
公共静态AddNewValue(类型t,A值)
{
如果(!\u dic.Keys.Contains(t))
{
锁
{
如果(!\u dic.Keys.Contains(t))
{
_添加(t,值);
}
}
}
}

是的,这不是线程安全的。如果一个线程正在修改字典,而另一个线程在锁外执行
包含的
,则会出现异常。

是,这不是线程安全的。如果一个线程正在修改字典,而另一个线程在锁外执行
Contains
,则会出现异常。

您应该使用
\u dic.ContainsKey
。我认为使用
\u dic.Keys.Contains
违背了使用字典的全部目的。你应该使用
\u dic.ContainsKey
。我认为使用
\u dic.Keys.Contains
违背了使用字典的全部目的。