【发布时间】:2013-12-05 12:26:52
【问题描述】:
在 VS2010 中运行的 Resharper 8 告诉我我可以删除对 principal.Identity != null 的检查:
我假设这是因为 IPrincipal 的代码中潜伏着 NotNull 属性或某些东西,但编写自己的 IPrincipal 实现并返回 null 标识很容易:
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: Resharper 错误报告提交至 http://youtrack.jetbrains.com/issue/RSRP-398551
【问题讨论】:
-
“在 VS2010 中运行的 Resharper 8” R# 8 是否适用于 VS2010? jetbrains.com/resharper/documentation/… 如果是这样,我很高兴,因为我认为我无法将它用于 VS2012、VS2010 :)
-
@Dylan 你能打破它吗?如果是,那么这是 Resharpers 部分的错误
-
你试过你的 FooPrincipal 类了吗? R# 的行为是否与它不同?
标签: c# resharper iprincipal