我有一个.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”解决了这个问题。谢谢,伙计们!
答案 0 :(得分:16)
添加到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>
答案 1 :(得分:4)
您的代码有效 - 它应该可以正常工作。进入项目的属性页,确保“Target Framework”是.NET 3.0或3.5。
答案 2 :(得分:3)
语法有效。您可以设置不同的访问修饰符。你不是在界面上吗?这些课程中的课程不是抽象的吗?
此外,与您所定位的框架的v。无关,因为这是编译器功能。 VS2008将为您实现具有后备存储的属性。
答案 3 :(得分:1)
你是对的;这种风格是允许的。
我会查看引用的标准程序集。我不确定你需要编译哪个,但我想你有点指向csc.exe的.Net v2.0版本。
答案 4 :(得分:1)
该错误不应来自您发布的代码。根据MSDN,您已经做到了这一点:http://msdn.microsoft.com/en-us/library/bb384054.aspx
因此我建议您重新检查错误消息,以及编译器说错误的来源。您发布的消息的文本没有包含对属性的引用,并且函数有类似的消息...任何缺少实现而不在接口或标记为abstract或extern的内容都可能生成此错误。
auto-property是C#3.0语言/编译器的一个特性。如果您使用的是VS 2008,即使您的目标是.NET 2.0,它也应该可以正常工作。我只是测试它以确保。
答案 5 :(得分:1)
如果您在MyControl.ascx中使用 CodeFile =“MyControl.ascx.cs”而不是 CodeBehind =“MyControl.ascx.cs,也会发生此错误”。
对于 CodeFile ,2.0编译器会尝试重新编译页面,即使您有WebProject而不是WebSite,当然 - 确实失败了。
将属性名称更改为 CodeBehind 修复了我的问题。
答案 6 :(得分:0)
您在哪里定义此属性?直接在as * x文件或codeBehind中? (我不认为这可能是一个原因,但如果构建目标是.NET 3.5我看不到任何其他东西)
答案 7 :(得分:0)
这也发生在没有生成web.config的原始网站项目中。
虽然解决方案文件说3.5,。Net需要web.config来声明它也能识别。我运行调试,允许它创建一个webconfig,一切正常。
所以它就像提供的答案一样,但只要确保你有答案。
答案 8 :(得分:-7)
只要您将 abstract 放在前面,或者实现这些方法。
public abstract string LogPath { get; private set; }
public abstract string ErrorMsg { get; private set; }