为什么 Activator.CreateInstance<>() 找不到内部无参数构造函数?

Why can't Activator.CreateInstance<>() find an internal parameterless constructor?

我正在尝试使用 Activator.CreateInstance<>() 创建一个对象的实例。用作模板的 class 只有一个构造函数,它没有参数但是是内部的。这应该不是问题,因为在调用 CreateInstance 的范围内仍然可以访问该构造函数。然而,它抛出异常“没有为类型定义的无参数构造函数......'。'”。我做了一个新项目来将它与任何外部因素隔离开来,但它仍然发生。这是测试项目

中的classes
namespace Debug
{
    class Program
    {
        static void Main(string[] args)
        {
            TestClass test = System.Activator.CreateInstance<TestClass>();
        }
    }

    class TestClass
    { 
        internal TestClass() { }
    }
}

如果我创建构造函数 public,则不会发生错误,但为什么会这样,因为 Main 应该可以访问它?还有什么可能的选择?真的不能只在实际项目中做构造函数public

我尝试的另一件事是将 TestClass 移动到 Activator 所在的 System 命名空间,以防 CreateInstance 方法本身无法访问构造函数但仍会抛出异常。

默认情况下 Activator.CreateInstance 仅适用于 public 构造函数

但是有一个重载允许它寻找 non-public 构造函数

public static object? CreateInstance (Type type, bool nonPublic);

https://docs.microsoft.com/en-us/dotnet/api/system.activator.createinstance?view=netcore-3.1#System_Activator_CreateInstance_System_Type_System_Boolean_

您不了解或误解了访问修饰符的工作原理。

您声明 TestClass 有一个构造函数,即 internalinternal 意味着只有同一命名空间中的类型才能访问该构造函数。 Activator 位于 System 命名空间中,该命名空间与您的 class 不同。因此 Activator 默认情况下不能访问 TestClass 的构造函数。

尝试将 TestClass 放入 System 命名空间是行不通的,因为这会产生潜在的安全风险 - 在这种情况下,运行时会忽略命名空间相同的事实。换句话说:您不能将 classes 添加到任何 BCL 名称空间中。

Activator 确实允许您通过其 object? CreateInstance(Type type, bool nonPublic) 重载调用 non-public 构造函数,但我想问为什么您仍然觉得需要一个 non-public 构造函数.毕竟,没有什么可以阻止其他代码使用相同的重载来调用您的 non-public 构造函数...