C# 为什么Resharper认为IPrincipal.Identity永远不会为空?
VS2010中运行的Resharper 8告诉我可以删除对C# 为什么Resharper认为IPrincipal.Identity永远不会为空?,c#,resharper,iprincipal,C#,Resharper,Iprincipal,VS2010中运行的Resharper 8告诉我可以删除对principal.Identity!=空: 我假设这是因为IPrincipal的代码中潜伏着NotNull属性或其他东西,但编写自己的IPrincipal实现返回空标识非常容易: void Main() { var foo = new FooPrincipal(); Console.WriteLine(foo.Identity == null ? "Yep!" : "Not Null"); } class FooPr
principal.Identity!=空
:
我假设这是因为IPrincipal的代码中潜伏着NotNull属性或其他东西,但编写自己的IPrincipal实现返回空标识非常容易:
void Main() {
var foo = new FooPrincipal();
Console.WriteLine(foo.Identity == null ? "Yep!" : "Not Null");
}
class FooPrincipal : IPrincipal {
public IIdentity Identity { get; set; }
public bool IsInRole(string role) { return(false); }
public FooPrincipal() {}
}
Resharper怎么知道传入此方法的IPrincipal不是我的返回空标识的FooPrincipal之一
编辑:好的,这里有一个完整的复制案例,Resharper实际上鼓励您编写在生产中爆炸的代码
using System;
using System.Security.Principal;
namespace ResharperPrincipalTest {
class Program {
static void Main(string[] args) {
var p = new TestPrincipal();
var isJeff = IsUserCalledJeff(p);
Console.WriteLine(isJeff);
}
static bool IsUserCalledJeff(IPrincipal principal) {
if (principal != null) {
if (principal.Identity == null) throw(new Exception("Resharper says this will never happen!"));
return (principal.Identity.Name == "jeff");
}
return false;
}
}
class TestPrincipal : IPrincipal {
public bool IsInRole(string role) {
return (false);
}
public IIdentity Identity { get; set; }
}
}
VS2010的屏幕截图显示了Resharper的“有用”突出显示
果然,当你点击F5时,程序会抛出一个异常。我想说这就是我最初问题的答案“因为Resharper错了”:
编辑2:Resharper在处提交的错误报告Resharper预计,如果执行该方法,参数
“IPrincipal principal”
不为空,因此请检查=在复古者眼中,空是绝对的
Resharper无法知道您是否将
“FooPrincipal”
作为参数发送给该方法。在更新您的问题之前,根据您提供的一段代码,可以认为R#足够聪明,能够理解:
- 由于
是私有的,因此(通常)不能在您的类之外调用它IsOverride
- 因为没有人调用它,或者只使用具体的实现调用它,例如
(请参阅)GenericPrinciple
- 那么它就不能是
null
现在,如果您可以同时生成一个警告和一个
NullReferenceException
,您可以假定它是R#中的一个bug。我也可以使用VS2010和R#7.1(使用.NET Framework 4.0)重现这一点
这是由Resharper的外部注释引起的。出于某种原因,您可以在文件中找到以下语句:
Resharper\u Install\u Folder\v7.1\Bin\ExternalAnnotations.NETFramework\mscorlib\4.0.0.0.Contracts.xml
<member name="P:System.Security.Principal.IPrincipal.Identity">
<attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
</member>
这说明任何IPrincipal.Identity属性都不会为null。
虽然这对于IPrincipal的默认Microsoft实现可能是正确的,但这并不总是意味着对于像您这样的自定义实现也是正确的
我从外部注释文件中删除了上面的行,问题就消失了
但是我看到你的错误报告导致了版本8.2.0.2713的修复,所以它可能会被解决。如果没有,您可以从注释文件中删除上面的行,您的问题也应该得到解决。“Resharper 8在VS2010中运行”R#8与VS2010一起工作吗?如果是这样的话,我很高兴,因为我觉得我不能用它来做VS2012,VS2010:)@Dylan你能把它打破吗?如果是的话,那么这是Resharpers partRelated上的一个错误:你试过你的FooPrincipal类吗?R#的行为是否与之不同?如果您所说的是正确的,那么为什么Resharper不标记语句
principal!=null
是否已过时?