Hug*_*une 4 c# generics resharper null language-specifications
在一个通用的GetHashCode(T foo)
方法,我检查是否foo
是null
.但是我偶然发现了一个奇怪的Resharper警告.
在下面的代码中,foo
永远不可能null
?
private class FooComparer<T> : IEqualityComparer<T> where T: Foo
{
public int GetHashCode(T foo)
{
// resharper warning: "Expression is always false"
if (Object.ReferenceEquals(null,foo)) return 0;
// ... calculate hash
}
}
Run Code Online (Sandbox Code Playgroud)
但据我所知,以下内容完全合法:
Foo foo = null;
var fooComparer = new FooComparer<Foo>();
int hash = fooComparer.GetHashCode(foo);
Run Code Online (Sandbox Code Playgroud)
MSDN forIEqualityComparer<T>.GetHashCode Method
说:
例外:
ArgumentNullException
的类型obj
是引用类型,obj
是null
。
这似乎暗示GetHashCode<T>(T obj)
使用null
参数调用违反了IEqualityComparer<T>
.
我假设 Resharper 假设调用者遵守该合同,因此永远不会传入null
.
小智 5
Method IEqualityComparer<T>.GetHashCode
具有[NotNull]
其参数的契约,因为它具有在null
作为参数提供时抛出异常的实现.
如果要将FooComparer<T>.GetHashCode
direct和exception-safe null
用作参数,可以按如下方式对其进行注释:
public int GetHashCode([JetBrains.Annotations.CanBeNull] T foo)
{
// resharper warning: "Expression is always false"
if (Object.ReferenceEquals(null,foo)) return 0;
// ... calculate hash
}
Run Code Online (Sandbox Code Playgroud)
然而,[Not-Null]
必须改进对参数的分析.http://youtrack.jetbrains.com/issue/RSRP-304111中的类似代码存在此错误
归档时间: |
|
查看次数: |
319 次 |
最近记录: |