12

我有一个 .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”解决了它。多谢你们!

4

9 回答 9

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>
于 2009-07-16T21:28:59.887 回答
4

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

于 2008-09-18T19:07:23.117 回答
3

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

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

于 2008-09-18T19:02:07.747 回答
1

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

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

于 2008-09-18T18:59:20.593 回答
1

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

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

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

于 2008-09-18T19:10:32.093 回答
1

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

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

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

于 2009-10-14T14:20:54.437 回答
0

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

于 2008-09-18T19:04:29.677 回答
0

这也发生在没有生成 web.config 的原始网站项目上。

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

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

于 2009-08-25T19:46:05.717 回答
-7

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

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

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

于 2008-09-18T18:59:04.510 回答