Resharper 8, работающий в VS2010, говорит мне, что я могу удалить проверку для principal.Identity != null
:
Я предполагаю, что это связано с тем, что атрибут NotNull или что-то скрывается в коде для IPrincipal, но довольно легко написать собственную реализацию IPrincipal, которая возвращает null Identity:
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, переданный в этот метод, не будет одним из моих FooPrincipals, которые возвращают нулевые идентификаторы?
EDIT: Хорошо, здесь полный случай воспроизведения, где 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