【问题标题】:.NET property generating "must declare a body because it is not marked abstract or extern" compilation error.NET 属性生成“必须声明一个主体,因为它没有标记为抽象或外部”编译错误
【发布时间】:2008-09-18 18:56:13
【问题描述】:

我有一个 .NET 3.5(目标框架)Web 应用程序。我有一些看起来像这样的代码:

public string LogPath { get; private set; }
public string ErrorMsg { get; private set; }

它给了我这些行的编译错误:

"must declare a body because it is not marked abstract or extern."

有什么想法吗?我的理解是,这种类型的属性在 .NET 3.0 中是有效的。

谢谢!


问题出在我的 .sln 文件本身。虽然我在构建选项中更改了目标版本,但在 .sln 文件中,我发现了这个:

TargetFramework = "3.0"

将其更改为“3.5”解决了它。谢谢各位!

【问题讨论】:

标签: c# properties compilation


【解决方案1】:

添加到 web.config

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
            <providerOption name="CompilerVersion" value="v3.5" />
            <providerOption name="WarnAsError" value="false" />
        </compiler>
    </compilers>
</system.codedom>

【讨论】:

  • 或者创建一个 web.config 文件:)
【解决方案2】:

您的代码是有效的 - 它应该可以正常工作。进入项目的属性页,确保“目标框架”是 .NET 3.0 或 3.5。

【讨论】:

  • 为什么要这样做?我之前在针对 .NET 2.0 的 VS2008 中使用过自动属性。事实上,我只是再次测试它以确保它工作正常。
  • 老实说,我认为这无关紧要。在面向 2.0 时它应该可以正常工作,因为自动属性只是编译器扩展为常规属性的简写。
【解决方案3】:

语法有效。您可以设置不同的访问修饰符。你不在一个接口上是吗?而且这些所在的类不是抽象的吗?

此外,您所针对的框架的 v. 无关紧要,因为这是编译器功能。 VS2008 将为您实现带有后备存储的属性。

【讨论】:

    【解决方案4】:

    你是对的;这种风格是允许的。

    我会研究引用的标准程序集。我不确定你需要哪个来编译它,但我认为你指向的是 .Net v2.0 版本的 csc.exe。

    【讨论】:

      【解决方案5】:

      该错误不应来自您发布的代码。根据 MSDN,您做得对:http://msdn.microsoft.com/en-us/library/bb384054.aspx

      因此,我建议您重新检查错误消息,以及编译器所说的错误来自何处。您发布的消息文本不包含对属性的引用,并且函数也有类似消息...任何缺少实现且不在接口上或标记为 abstract 或 extern 的内容都可能生成此错误。

      自动属性是 C# 3.0 语言/编译器的一个特性。如果您使用的是 VS 2008,即使您的目标是 .NET 2.0,它也应该可以工作。我刚刚对其进行了测试以确保。

      【讨论】:

        【解决方案6】:

        如果您在 MyControl.ascx 中使用 CodeFile="MyControl.ascx.cs" 而不是 CodeBehind="MyControl.ascx.cs,也会发生此错误”。

        CodeFile 的情况下,2.0 编译器会尝试重新编译页面,即使您有一个 WebProject 而不是一个网站,当然 - 确实会失败。

        将属性名称更改为 CodeBehind 解决了我的问题。

        【讨论】:

          【解决方案7】:

          你在哪里定义这个属性?直接在 as*x 文件中还是在 codeBehind 中? (我不认为这可能是一个原因,但如果 build-Target 是 .NET 3.5 我看不到其他任何东西)

          【讨论】:

            【解决方案8】:

            这也发生在未生成 web.config 的原始网站项目中。

            虽然解决方案文件说的是3.5,但.Net需要web.config声明它也能识别。我运行了调试,让它创建了一个 webconfig,一切正常。

            所以它就像提供的答案一样,但只要确保你有一个。

            【讨论】:

              【解决方案9】:

              是的,只要你把abstract放在前面,或者实现方法。

              public abstract string LogPath { get; private set; }
              public abstract string ErrorMsg { get; private set; }
              

              http://forums.asp.net/t/1031651.aspx

              【讨论】:

              • 他正在尝试利用方法的自动生成,这是 C# 3.0 中的一个新特性
              • MSDN有一个不使用abstract的例子:msdn.microsoft.com/en-us/library/bb384054.aspx
              • 您必须使用 abstract 的唯一情况是您的目标是 .net 2.0
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多