gpt4 book ai didi

c# - ConstructorInfo 可以没有 DeclaringType

转载 作者:行者123 更新时间:2023-11-30 23:21:21 24 4
gpt4 key购买 nike

我正在 GitHub 上浏览 System.Linq.Expressions 源代码并找到了 following code

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

// ...
}

第二个null检查搞糊涂了,于是去MSDN。关于 ConstructorInfo.DeclaringType,它有以下内容:

The DeclaringType property retrieves a reference to the Type object for the type that declares this member. A member of a type is either declared by the type or inherited from a base type, so the Type object returned by the DeclaringType property might not be the same as the Type object used to obtain the current MemberInfo object.

If the Type object from which this MemberInfo object was obtained did not declare this member, the DeclaringType property will represent one of its base types.

If the MemberInfo object is a global member (that is, if it was obtained from the Module.GetMethods method, which returns global methods on a module), the returned DeclaringType will be null.

因此对于 MemberInfo(ConstructorInfo 的派生类),DeclaringType 似乎可以为 null。但我不确定对于 ConstructorInfo 是否可以为 null。

所以我的问题是:

  1. ConstructorInfo.DeclaringType 可以为 null 吗?为什么 System.Linq.Expressions 代码要检查它?

  2. 如果DeclaringType可以为null,能举个例子吗?

  3. 如果 DeclaringType 可以为 null,这是否意味着 CLR 支持全局构造函数? (我试过研究这个但找不到任何东西)

最佳答案

这是 ConstructorInfo.DeclaringType 的源代码:

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

我没有这种情况的具体示例,但考虑到这是 ConstructorInfo 类本身,我很清楚它是专门编写的,它的 可能是DeclaringType 属性可以返回 null

我怀疑您是否可以使用 C# 代码导致这种情况发生,但 CLR 支持多种语言。 C++/CLI 对我来说似乎是这种情况最有可能的罪魁祸首,因为 C++/CLI 程序集最终会产生一堆样板和全局成员,但 VB.NET 也做一些全局的事情。据推测,可以直接生成 IL,这也会造成这种情况。

关于c# - ConstructorInfo 可以没有 DeclaringType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39240524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com