【问题标题】:Trying to reproduce "must declare a body" compiler error试图重现“必须声明主体”编译器错误
【发布时间】:2015-12-03 07:36:49
【问题描述】:

我正在尝试使用网站中给出的确切代码重现 C# compiler error CS0840

class Test36
{
    public int myProp { get; } // CS0840

    // to create a read-only property
    // try the following line instead
    public int myProp2 { get; private set; }

}

public Form1()
{
    InitializeComponent();

    Test36 test = new Test36();
}

我正在使用 Visual Studio Community 2015 在 .NET 4.0 上运行它。令人惊讶的是,我无法重现它。编译器不会抛出任何错误:

为什么编译器没有抛出任何错误?

【问题讨论】:

    标签: c# .net visual-studio compiler-errors visual-studio-2015


    【解决方案1】:

    您使用的是实现 C# 6 的 Visual Studio 2015。您针对 .NET 4 的事实是无关紧要的 - 大多数 C# 6 语言功能根本不依赖于框架功能。您正在使用的 C# 6 代码可以轻松在不参考任何现代 CLR 或框架功能的情况下进行编译 - 如果语言设计者决定这样做,它本可以与 .NET 1.0 一起使用 :)

    您需要将语言级别设置为 C# 5 才能在此处看到错误。在项目属性/构建/高级对话框中执行此操作:

    然后你会得到这个错误:

    错误 CS8026:C# 5 中不提供“只读自动实现的属性”功能。请使用语言版本 6 或更高版本。

    诚然,这不是您真正想看到的错误 - 我认为您需要使用早期版本的编译器才能获得确切的错误。

    【讨论】:

    • 等不及要发布 C# 6 规范了,这大概不会再将其称为编译器错误了。
    • 该项目在 C# 3、4、5 和 6 中编译良好。它无法在 ISO-1 和 ISO-2 上编译。使用 ISO-2 编译时,出现以下错误:CS8023 Feature 'automatically implemented properties' is not available in C# 2. Please use language version 3 or greater.
    • @Donotalo:这只是 second 属性的情况。第一个属性 (public int myProp { get; }) 确实无法在 C# 5 模式下编译。我自己测试过,因此错误消息指的是“只读自动实现的属性”。
    • @JonSkeet:我已经从代码中删除了第二个属性。第一个属性public int myProp { get; } 真正在 C# 3、4 和 5 中编译。
    • @Donatolo:真的,真的不应该 - 而且它不在我的安装中。您可以通过电子邮件将您的解决方案的 zip 文件发送给我吗?我的地址在我的个人资料中。
    【解决方案2】:

    我猜这是因为您使用的是带有 C# 6 的 Visual Studio 2015,它允许您指定仅从构造函数(又名read-only properties)设置的属性。

    请看下面的例子:

    class Test
    {
        public Test() // <-- this one does compile since it is the constructor
        {
            MyProp = 1;
        }
    
        public void SomeMethod() // <-- this one doesn't compile
        {
            MyProp = 1;
        }
    
        public int MyProp { get; } // <-- no CS0840 any more!
    }
    

    【讨论】:

    • 您的最终属性不是只读属性。这是一个“读取公共,写入私有”的属性。只有myprop 是真正的只读属性。
    • 同意,但这是官方文档的代码块 :) @JonSkeet
    • 完成了非常规的名称?你能链接到那个文档吗?
    • 啊,我明白了。是的,这是非常糟糕的文档,IMO。 (除此之外,我不希望文档使用这样的非常规名称。)我认为如果没有此处的污点,您的答案会更好:)
    猜你喜欢
    • 2010-12-10
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多