Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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# MemberInfo.DeclaringType上出现奇怪的Resharper警告_C#_Reflection_Resharper_Resharper 5.1 - Fatal编程技术网

C# MemberInfo.DeclaringType上出现奇怪的Resharper警告

C# MemberInfo.DeclaringType上出现奇怪的Resharper警告,c#,reflection,resharper,resharper-5.1,C#,Reflection,Resharper,Resharper 5.1,Resharper告诉我MemberInfo.DeclaringType永远不能为null: 但是,当运行该代码时,将打印文本“顶级成员”。我不明白,这里怎么了 Resharper在这里完全错了MemberInfo是一种abstract类型,任意实现都可以随意返回任何内容,包括null 例如: class EvilMemberInfo : MemberInfo { public override System.Type DeclaringType { get {

Resharper告诉我MemberInfo.DeclaringType永远不能为null:


但是,当运行该代码时,将打印文本“顶级成员”。我不明白,这里怎么了

Resharper在这里完全错了
MemberInfo
是一种
abstract
类型,任意实现都可以随意返回任何内容,包括
null

例如:

class EvilMemberInfo : MemberInfo
{
    public override System.Type DeclaringType
    {
        get { return null; }
    }

    // Rest omitted for brevity
}

Microsoft代码契约声明它从不为空

// System.Reflection.MemberInfo
public virtual Type DeclaringType
{
    get
    {
        Contract.Ensures(Contract.Result<Type>() != null, null, "Contract.Result<Type>() != null");
        Type result;
        return result;
    }
}
//System.Reflection.MemberInfo
公共虚拟类型DeclaringType
{
得到
{
Contract.Contract(Contract.Result()!=null,null,“Contract.Result()!=null”);
类型结果;
返回结果;
}
}

所以ReSharper依赖于这里的代码契约。

您是否进行了全面清理和重建?resharper经常会发出奇怪的警告,因为它最近没有重新运行分析。否则它可能只是一个bug。@CMP,jep,是的。我觉得奇怪的是,这将是一个bug,因为像NotNullAttribute这样的属性是自动分配给标准库的。如果代码中有bug,那一定是以前注意到的。我指的是resharper的静态分析引擎中的bug。甚至说它在某些情况下会返回null。相关:这正是覆盖系统。Type用于DeclaringType。也许他们应该称之为邪恶类型我最近声称在Resharper中发现了一个bug,但结果证明我错了。不过,这次我的问题没有那么咄咄逼人,但我同意你的看法。@rsbarro,不!这并不完全是System.Type的重写,因为类型可以嵌套…@jbsnoro不跟随您。在ILSpy中,System.Type是抽象的,它重写DeclaringType属性,并在getter上返回null。我遗漏了什么?@rsbarro,我想到了场景类Foo{public class Bar{}},其中typeof(Foo.Bar).DeclaringType不是null。但是你是对的,抱歉:POk,我已经把它发布在代码合同论坛上了,