在 VS2010 中运行的 Resharper 8 告诉我我可以删除检查principal.Identity != null
:
我假设这是因为 IPrincipal 的代码中有一个 NotNull 属性或潜伏的东西,但是编写自己的返回 null 标识的 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 不会是我的返回 null 身份的 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:在http://youtrack.jetbrains.com/issue/RSRP-398551提交的 Resharper 错误报告