.NET 属性生成“必须声明主体,因为它未标记为抽象或外部”编译错误
-
01-07-2019 - |
题
我有一个 .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”解决了它。多谢你们!
解决方案
添加到 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>
其他提示
您的代码是有效的 - 它应该可以正常工作。进入项目的属性页并确保“目标框架”是.NET 3.0 或 3.5。
语法有效。并且您可以设置不同的访问修饰符。你不是在界面上吗?这些所在的类不是抽象的,不是吗?
另外,v 是什么并不重要。您的目标框架的,因为这是 编译器功能. 。VS2008 将为您实现带有后备存储的属性。
你是对的;这种风格是允许的。
我会研究引用的标准程序集。我不确定您需要哪个来编译它,但我认为您指向的是 csc.exe 的 .Net v2.0 版本。
该错误不应来自您发布的代码。根据 MSDN 的说法,你做对了: http://msdn.microsoft.com/en-us/library/bb384054.aspx
因此,我建议您重新检查错误消息,以及编译器指出错误来自何处。您发布的消息文本不包含对属性的引用,并且有类似的函数消息......任何缺少实现且不在接口上或标记为抽象或外部的内容都可能生成此错误。
auto 属性是 C# 3.0 语言/编译器的一项功能。如果您使用的是 VS 2008,即使您的目标是 .NET 2.0,它也应该可以工作。我刚刚测试了一下以确定。
如果您使用的是此错误,也可能会发生 代码文件MyControl.ascx 中的 ="MyControl.ascx.cs" 而不是 隐藏代码="MyControl.ascx.cs"。
的情况下 代码文件, ,即使您有 WebProject 而不是 WebSite,2.0 编译器也会尝试重新编译页面,当然会失败。
将属性名称更改为 隐藏代码 解决了我的问题。
你在哪里定义这个属性?直接在as*x文件中还是在codeBehind中?(我不认为这可能是一个原因,但如果构建目标是 .NET 3.5,我看不到其他任何东西)
这种情况也会发生在未生成 web.config 的原始网站项目上。
尽管解决方案文件显示为 3.5,但 .Net 需要 web.config 来声明它也可以识别。我运行了调试,允许它创建一个 webconfig,一切正常。
这就像所提供的答案,但只要确保你有一个答案即可。
是的,只要你把 抽象的 前面的,或者实现方法。
public abstract string LogPath { get; private set; }
public abstract string ErrorMsg { get; private set; }