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