Почему ReSharper говорит мне, что "User.Identity == null" всегда будет ложным?

У меня есть простое свойство внутри одного из моих классов контроллера ASP.NET MVC.

Я видел это много раз прежде, поэтому поймите, что означает сообщение, но обычно оно имеет смысл. Это, однако, не делает. Чтобы добраться до подчеркнутого утверждения, User не должен быть нулевым, поэтому проверка на User.Identity Это хорошо.

Identity собственность является частью IPrincipal интерфейс и возвращает объект, который наследует IIdentity,

Чтобы наследовать этот интерфейс или любой другой интерфейс в этом отношении, это свойство должно быть ссылочным типом и, следовательно, потенциально может иметь значение null, верно?

Так почему мой любимый ReSharper стонет?

1 ответ

Решение

Вы сказали, что используете GenericPrinciple как реализация IPrincipal, Для этого класса Identity собственность действительно никогда не может быть null, Это легко увидеть, если вы посмотрите на исходный код (например, используя JetBrains dotPeek).

За это вы можете поблагодарить аннотации кода ReSharper для библиотек классов.NET Framework.

В моих аннотациях ReSharper 6.1 есть одна аннотация кода, связанная с этим (в файле ExternalAnnotations \ mscorlib \ mscorlib.4.0.0.0.Nullness.Generated.xml):

  <member name="M:System.Security.Principal.GenericPrincipal.#ctor(System.Security.Principal.IIdentity,System.String[])">
    <parameter name="identity">
      <attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
    </parameter>
  </member>

Это только для конструктора, хотя я не нашел один для Identity имущество. Таким образом, либо вы используете версию ReSharper, которая также имеет аннотацию для этого свойства, либо ReSharper выполняет дополнительный анализ.

В любом случае, это ReSharper быть умным (и правильным!).

Другие вопросы по тегам