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

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

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

enter image description here

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

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

Чтобы наследовать этот интерфейс или какой-либо интерфейс, это свойство должно быть ссылочным типом и, следовательно, потенциально может быть нулевым, правильно?

Так почему мой возлюбленный решающий стонет?

4b9b3361

Ответ 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 умный (и правый!).