我喜欢Resharper,但有时会提供不正确的警告,可能是因为BCL类型的内置注释是错误的。例如,在此代码中:
private static string GetDescription(T value)
{
Type type = typeof(T);
string name = Enum.GetName(type, value);
if (name != null)
{
...
它在if
声明中给出了警告:“表达始终是真的”。但是Enum.GetName
可以返回null:
string name = Enum.GetName(typeof(DayOfWeek), (DayOfWeek)42); // null
我认为这是因为[NotNull]
有一个Enum.GetName
注释。有没有办法解决这个问题,所以我没有得到警告?
注意:我正在使用Resharper 5.1;也许这个问题在版本6中得到修复,但我现在不愿意升级。
答案 0 :(得分:6)
好的,我明白了。内置注释在Resharper安装目录(我的机器上为C:\Program Files (x86)\JetBrains\ReSharper\v5.1\Bin\ExternalAnnotations\
)的XML文件中定义。解决方案是编辑相应的文件以删除或修复错误的注释。
如果是Enum.GetName
,则要更改的文件为mscorlib\mscorlib.[version].Contracts.xml
。我刚评论了这个注释:
<member name="M:System.Enum.GetName(System.Type,System.Object)">
<attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
</member>
重新启动Visual Studio,现在警告消失了:)
答案 1 :(得分:1)
只是对托马斯回答的更新,他们似乎在过去几年中已经改变了一切。
对于Resharper 8.2.3,上述文件现在位于:
C:\Users\YOUR_USER_NAME\AppData\Local\JetBrains\ReSharper\vAny\packages\ReSharper.ExternalAnnotations.8.2.3001\ReSharper\vAny\annotations\.NETFramework\mscorlib\...
因此,如果您尝试这样做,则可以搜索该路径(或者向上搜索非mscorlib
个文件)。