【问题标题】:C# compiler error differences between CS0122 and CS0143CS0122 和 CS0143 之间的 C# 编译器错误差异
【发布时间】:2015-12-14 13:36:59
【问题描述】:

让我们考虑以下第一个示例:

public class ClassNameExample
{
    private ClassNameExample()
    {
        //code goes here    
    }
}

现在,如果我尝试在同一个程序集中实例化 ClassNameExample 类,我将收到“由于其保护级别而无法访问”编译器错误消息 (CS0122)。

但是,如果我尝试从不同的程序集实例化 ClassNameExample 类,我会收到“类型‘类’没有定义构造函数”编译器错误消息 (CS0143)

有人能解释为什么编译器会看到它们不同吗?

作为参考,我在 Visual Studio 2012 .NET 4.5 中尝试过。

【问题讨论】:

  • 老实说,当您在同一个程序集中时,编译器知道私有构造函数的存在,因此它告诉您它是私有的。当您在另一个程序集中时,它根本不知道,它只知道该类没有公开任何公共构造函数
  • 我的猜测是,因为在编译同一个程序集时,编译器会看到构造函数定义,但它是私有的,因此无法访问。编译另一个程序集时,编译器只能看到该程序集的已发布接口,甚至无法访问内部。在该公共接口中,没有构造函数,就编译器而言,没有构造函数。但是,我无法引用任何可靠的消息来源,因此我很高兴看到有人将其发布为答案。

标签: c# .net compiler-errors


【解决方案1】:

我试图查看 Microsoft.CSharp.CSharpCodeGenerator 的作用并找出错误的填充位置,但最后的代码依赖于外部文件。

我能给你的唯一答案是:如果你用

创建一个实例
Assembly.GetExecutingAssembly().CreateInstance("ClassNameExample");

甚至Activator.CreateInstance("Your assembly", "ClassNameExample");

两者都返回 null 因为它们依赖于公共构造函数,请检查标志

    public object CreateInstance(string typeName)
    {
      return this.CreateInstance(typeName, false, BindingFlags.Instance | BindingFlags.Public, (Binder) null, (object[]) null, (CultureInfo) null, (object[]) null);
    }

    Activator.CreateInstance(assemblyName, typeName, false, BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance, (Binder) null, (object[]) null, (CultureInfo) null, (object[]) null, (Evidence) null, ref stackMark);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2014-03-15
    • 2021-12-21
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多