Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Resharper认为IPrincipal.Identity永远不会为空?_C#_Resharper_Iprincipal - Fatal编程技术网

C# 为什么Resharper认为IPrincipal.Identity永远不会为空?

C# 为什么Resharper认为IPrincipal.Identity永远不会为空?,c#,resharper,iprincipal,C#,Resharper,Iprincipal,VS2010中运行的Resharper 8告诉我可以删除对principal.Identity!=空: 我假设这是因为IPrincipal的代码中潜伏着NotNull属性或其他东西,但编写自己的IPrincipal实现返回空标识非常容易: void Main() { var foo = new FooPrincipal(); Console.WriteLine(foo.Identity == null ? "Yep!" : "Not Null"); } class FooPr

VS2010中运行的Resharper 8告诉我可以删除对
principal.Identity!=空

我假设这是因为IPrincipal的代码中潜伏着NotNull属性或其他东西,但编写自己的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不是我的返回空标识的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在处提交的错误报告Resharper预计,如果执行该方法,参数
“IPrincipal principal”
不为空,因此请检查=在复古者眼中,空是绝对的


Resharper无法知道您是否将
“FooPrincipal”
作为参数发送给该方法。

在更新您的问题之前,根据您提供的一段代码,可以认为R#足够聪明,能够理解:

  • 由于
    IsOverride
    是私有的,因此(通常)不能在您的类之外调用它
  • 因为没有人调用它,或者只使用具体的实现调用它,例如
    GenericPrinciple
    (请参阅)
  • 那么它就不能是
    null

现在,如果您可以同时生成一个警告和一个
NullReferenceException
,您可以假定它是R#中的一个bug。

我也可以使用VS2010和R#7.1(使用.NET Framework 4.0)重现这一点

这是由Resharper的外部注释引起的。出于某种原因,您可以在文件中找到以下语句:

Resharper\u Install\u Folder\v7.1\Bin\ExternalAnnotations.NETFramework\mscorlib\4.0.0.0.Contracts.xml

  <member name="P:System.Security.Principal.IPrincipal.Identity">
    <attribute ctor="M:JetBrains.Annotations.NotNullAttribute.#ctor" />
  </member>

这说明任何IPrincipal.Identity属性都不会为null。 虽然这对于IPrincipal的默认Microsoft实现可能是正确的,但这并不总是意味着对于像您这样的自定义实现也是正确的

我从外部注释文件中删除了上面的行,问题就消失了


但是我看到你的错误报告导致了版本8.2.0.2713的修复,所以它可能会被解决。如果没有,您可以从注释文件中删除上面的行,您的问题也应该得到解决。

“Resharper 8在VS2010中运行”R#8与VS2010一起工作吗?如果是这样的话,我很高兴,因为我觉得我不能用它来做VS2012,VS2010:)@Dylan你能把它打破吗?如果是的话,那么这是Resharpers partRelated上的一个错误:你试过你的FooPrincipal类吗?R#的行为是否与之不同?如果您所说的是正确的,那么为什么Resharper不标记语句
principal!=null
是否已过时?