Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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# 为什么可以';t Activator.CreateInstance<&燃气轮机;()是否查找内部无参数构造函数?_C#_.net_Constructor_Createinstance - Fatal编程技术网

C# 为什么可以';t Activator.CreateInstance<&燃气轮机;()是否查找内部无参数构造函数?

C# 为什么可以';t Activator.CreateInstance<&燃气轮机;()是否查找内部无参数构造函数?,c#,.net,constructor,createinstance,C#,.net,Constructor,Createinstance,我正在尝试使用Activator.CreateInstance()创建对象的实例。用作模板的类只有一个构造函数,该构造函数没有参数,但是是内部的。这不应该是一个问题,因为在调用CreateInstance的范围内仍然可以访问该构造函数。但是,它抛出异常“没有为类型定义无参数构造函数…”。我做了一个新项目,将其与任何外部因素隔离开来,但这种情况仍然存在。以下是测试项目中的类 namespace Debug { class Program { static void

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

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

    class TestClass
    { 
        internal TestClass() { }
    }
}
命名空间调试
{
班级计划
{
静态void Main(字符串[]参数)
{
TestClass test=System.Activator.CreateInstance();
}
}
类TestClass
{ 
内部TestClass(){}
}
}
如果我将构造函数公开,则不会发生错误,但为什么会这样,因为Main应该可以访问它?有什么可能的替代方案?我真的不能在真实的项目中公开构造函数


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

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

但是,有一个重载允许它查找非公共构造函数

公共静态对象?CreateInstance(类型,bool非公共)


_

您可能不理解或误解访问修饰符的工作原理


您声明了
TestClass
拥有一个
内部的构造函数
internal
意味着只有同一命名空间中的类型才能访问该构造函数<代码>激活器
位于
系统
命名空间中,该命名空间与您的类不同。因此,默认情况下,
Activator
无法访问
TestClass
的构造函数

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


Activator
确实允许您通过其重载调用非公共构造函数,但我想问一下,您为什么觉得需要非公共构造函数。毕竟,没有什么能阻止其他代码使用相同的重载来调用非公共构造函数……

internal
意味着只有同一程序集中的类型才能访问该成员。名称空间与访问修饰符完全正交。当然,您可以向
系统
名称空间添加类型,但这可能会导致比解决问题更多的问题。