2016-08-31 22 views
1

何DeclaringTypeを持っていないし、私は2番目のnullチェックで混乱していたfollowing codeはConstructorInfoはそうMSDNに行き、私は<a href="https://github.com/dotnet/corefx" rel="nofollow">GitHub</a>にSystem.Linq.Expressionsソースコードを閲覧した

public static NewExpression New(ConstructorInfo constructor, IEnumerable<Expression> arguments) 
{ 
    ContractUtils.RequiresNotNull(constructor, nameof(constructor)); 
    ContractUtils.RequiresNotNull(constructor.DeclaringType, nameof(constructor)); 

    // ... 
} 

を見つけたことができます。 ConstructorInfo.DeclaringTypeについて次のように述べました。

DeclaringTypeプロパティは、このメンバを宣言する型のTypeオブジェクトへの参照を取得します。型のメンバーは、型によって宣言されるか、基本型から継承されるため、DeclaringTypeプロパティによって返されるTypeオブジェクトは、現在のMemberInfoオブジェクトを取得するために使用されるTypeオブジェクトと同じでない場合があります。

このMemberInfoオブジェクトが取得されたTypeオブジェクトがこのメンバーを宣言しなかった場合、DeclaringTypeプロパティはその基本型の1つを表します。

MemberInfoオブジェクトがグローバルメンバーの場合(つまり、モジュールのグローバルメソッドを返すModule.GetMethodsメソッドから取得された場合)、返されるDeclaringTypeはnullになります。

したがって、DeclaringTypeは、MemberInfo(ConstructorInfoが派生するクラス)の場合、nullになる可能性があります。しかし、ConstructorInfoではnullかどうかは不明です。私の質問にそう

  1. ConstructorInfo.DeclaringTypeが今までnullにすることはできますか?なぜSystem.Linq.Expressionsコードがそれをチェックしていますか?

  2. DeclaringTypeにnullを設定できる場合は、例を挙げてください。

  3. DeclaringTypeがnullでもかまいませんが、これはCLRがグローバルコンストラクタをサポートしていることを意味しますか? (私はこれを研究しようとしましたが、何かを見つけることができません)

+1

3)はい - モジュールイニシャライザまたはモジュールコンストラクタを検索します – thehennyy

答えて

1

はここConstructorInfo.DeclaringTypeのソースコードです:私はこのシナリオの具体的な例を持っていない

public override Type DeclaringType 
{ 
    get 
    { 
     return m_reflectedTypeCache.IsGlobal ? null : m_declaringType; 
    } 
} 

、しかしことを考えますこれはConstructorInfoクラスそのものです。具体的には​​プロパティがnullを返す可能性があると書かれていました。

これはC#コードで発生する可能性がありますが、CLRは多種多様な言語をサポートしている可能性があります。このシナリオでは、C++/CLIアセンブリが大量の定型メンバおよびグローバルメンバとなっているため、C++/CLIはこのシナリオで私にとって最も犯しそうなのではないかと思われますが、VB.NETではグローバルな処理も行っています。おそらく、ILを直接生成することも可能であり、この状況もまた生じるであろう。

関連する問題

 関連する問題