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