将 `null` 添加到 SynchronizedCollection 是否有效 - 文档错误 and/or 已删除限制?

Is it valid to add `null` to a SynchronizedCollection - documentation error and/or removed restriction?

根据 SynchronizedCollection.Add,当 "The value set is null or is not of the correct generic type T for the collection" 时抛出 ArgumentException。 ReSharper 8 也认为这是一个 [NotNull] 参数。

但是在LINQPad中运行以下代码时没有异常:

new SynchronizedCollection<string>().Add((string)null);

此外,SynchronizedCollection.Add 的检查显示它向下委托给 List.Insert,它没有此限制。 ("The object to insert. The value can be null for reference types."

鉴于这种相互矛盾的信息和行为,将 null 添加到 SynchronizedCollection 是否有效?

以前添加 null 值会引发异常吗?

这是文档错误。异常只发生在 IList.Add(object) (或任何其他 IList 方法)而不是正常的 Add(T).

此外,只有当 T 是值类型并且您传入 null 时才会发生错误,对于非值类型则不会发生。

来自the Reference Source

public class SynchronizedCollection<T> : IList<T>, IList
{
    //...

    int IList.Add(object value)
    {
        VerifyValueType(value);

        lock (this.sync)
        {
            this.Add((T)value);
            return this.Count - 1;
        }
    }

    //...

    static void VerifyValueType(object value)
    {
        if (value == null)
        {
            if (typeof(T).IsValueType)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.SynchronizedCollectionWrongTypeNull)));
            }
        }
        else if (!(value is T))
        {
            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.SynchronizedCollectionWrongType1, value.GetType().FullName)));
        }
    }
}

如果您查看错误信息

The value set is null or is not of the correct generic type T for the collection

这种情况在 Add(T) 中是不可能的,你会得到一个编译器错误而不是 运行 时间错误。如果参数是 object 类型,则只能传入不正确的泛型类型才能获得 ArgumentException.

的 运行 时间异常