C# 向SynchronizedCollection添加'null'是否有效-文档错误和/或删除的限制?

C# 向SynchronizedCollection添加'null'是否有效-文档错误和/或删除的限制?,c#,collections,synchronizedcollection,C#,Collections,Synchronizedcollection,根据,当“值集为null或不是集合的正确泛型类型T”时,将引发ArgumentException。ReSharper 8还认为这是一个[NotNull]参数 但是,在LINQPad中运行以下代码时没有异常: new SynchronizedCollection<string>().Add((string)null); newsynchronizedcollection().Add((string)null); 此外,对SynchronizedCollection.Add的检查显示

根据,当“值集为null或不是集合的正确泛型类型T”时,将引发ArgumentException。ReSharper 8还认为这是一个[NotNull]参数

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

new SynchronizedCollection<string>().Add((string)null);
newsynchronizedcollection().Add((string)null);
此外,对SynchronizedCollection.Add的检查显示它将委托给不具有此限制的对象。(“要插入的对象。引用类型的值可以为null。”

鉴于这种相互冲突的信息和行为,向SynchronizedCollection添加
null
是否有效


过去,添加
null
值会引发异常吗?

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

此外,只有当
T
是值类型且传入null时,才会发生错误,而非值类型不会发生错误

公共类SynchronizedCollection:IList,IList { //... int IList.Add(对象值) { 验证ValueType(值); 锁定(this.sync) { 此项。添加((T)值); 返回这个。计数-1; } } //... 静态void VerifyValueType(对象值) { 如果(值==null) { if(类型(T).IsValueType) { 抛出DiagnosticUtility.ExceptionUtility.ThrowHelperError(新参数异常(SR.GetString(SR.SynchronizedCollectionErrorTypeNull)); } } 否则,如果(!(值为T)) { 抛出DiagnosticUtility.ExceptionUtility.ThrowHelperError(新参数异常(SR.GetString(SR.SynchronizedCollectionErrorType1,value.GetType().FullName)); } } } 如果您查看错误信息

值集为null或不是集合的正确泛型类型T


使用
Add(T)
不可能出现这种情况。您将得到一个编译器错误,而不是运行时错误。如果参数的类型为
object
,则只能传入一个不正确的泛型类型,以获得
ArgumentException

的运行时异常在我看来像是一个文档错误。不是唯一的错误:“将项目添加到线程安全的只读集合。”。只读?使用connect.microsoft.com进行报告。啊,这对于文档如何变成当前状态更为合理,谢谢!
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)));
        }
    }
}