将 `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 时才会发生错误,对于非值类型则不会发生。
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
.
的 运行 时间异常
根据 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 时才会发生错误,对于非值类型则不会发生。
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
.