2008-09-18 12 views
12

J'ai une application web .NET 3.5 (framework cible). J'ai un code qui ressemble à ceci:Propriété .NET générant "doit déclarer un corps car il n'est pas marqué abstrait ou externe" erreur de compilation

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

Il me donne cette erreur de compilation pour ces lignes:

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

Toutes les idées? Ma compréhension était que ce style de propriété était valide à partir de .NET 3.0.

Merci!


Le problème s'est avéré être dans mon fichier .sln lui-même. Bien que je changeais la version cible dans mes options de construction, dans le fichier .sln, je trouve ceci:

TargetFramework = "3.0" 

Changement que « 3,5 » résolu. Merci les gars!

+0

Y a-t-il une chance que tu puisses poster toute la classe? Le code que vous avez posté semble tout à fait correct pour les propriétés auto readonly dans C# 3.0. –

+1

Pour référence: http://msdn.microsoft.com/en-us/library/bb384054.aspx –

Répondre

16

ajouter au 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> 
+0

Ou peut-être créer un fichier web.config :) –

+0

merci! Cela a également corrigé mon erreur. +1 – David

-7

Il est, tant que vous mettez résumé à l'avant, ou mettre en œuvre les méthodes.

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

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

+0

Il tente d'utiliser la génération automatique des méthodes, une nouvelle fonctionnalité dans C# 3.0 – Guvante

+1

MSDN a un exemple qui n'utilise pas abstract: http://msdn.microsoft.com/en-us/library/bb384054.aspx –

+0

La seule fois où vous devez utiliser abstract est si vous ciblez .net 2.0 –

1

Vous avez raison; ce style est autorisé.

Je regarderais dans les assemblées standard référencées. Je ne suis pas sûr de ce que vous auriez besoin de compiler, mais je pense que vous pointez sur la version .Net v2.0 de csc.exe.

3

La syntaxe est valide. Et vous pouvez définir différents modificateurs d'accès. Vous n'êtes pas sur une interface êtes-vous? Et la classe dans laquelle ils sont n'est pas abstraite, n'est-ce pas?

De même, peu importe quelle est la taille de la structure que vous ciblez, car c'est une fonctionnalité de compilation. VS2008 implémentera la propriété w/backing stores pour vous.

0

Où définissez-vous ces propriétés? Directement dans le fichier as * x ou dans le codeBehind? (Je ne pense pas que cela puisse être une raison, mais si la cible de construction est .NET 3.5 je ne vois rien d'autre)

4

Votre code est valide - il devrait fonctionner correctement. Allez dans les pages de propriétés de votre projet et assurez-vous que le "Target Framework" est .NET 3.0 ou 3.5.

+0

Pourquoi cela devrait-il fonctionner? J'ai utilisé des propriétés automatiques dans VS2008 ciblant .NET 2.0 avant. En fait, je l'ai testé de nouveau pour m'assurer, et ça fonctionne bien. –

+0

Pour être honnête, je ne pense pas que cela devrait avoir de l'importance. Cela devrait fonctionner correctement lors du ciblage de la version 2.0, car les propriétés automatiques ne sont qu'un raccourci que le compilateur étend de toute façon aux propriétés normales. –

1

Cette erreur ne doit pas provenir du code que vous avez publié. D'après MSDN, vous avez fait ce droit: http://msdn.microsoft.com/en-us/library/bb384054.aspx

Par conséquent je vous recommande de revérifier le message d'erreur, et d'où le compilateur dit que l'erreur vient. Le texte du message que vous avez posté n'incluait pas de référence aux propriétés, et il y a un message similaire pour les fonctions ... Tout ce qui manque à une implémentation et pas sur une interface ou un résumé marqué ou extern peut générer cette erreur.

La propriété auto est une fonctionnalité du langage/compilateur C# 3.0. Si vous utilisez VS 2008, cela devrait fonctionner même si vous ciblez .NET 2.0. Je l'ai juste testé pour être sûr.

0

Cela se produit également sur un projet de site Web brut dans lequel aucun fichier web.config n'a été généré.

Bien que le fichier de solution ait indiqué 3.5, .Net avait besoin du fichier web.config pour l'indiquer également. J'ai exécuté le débogage lui permettant de créer un webconfig, et tout fonctionnait.

Donc, c'est comme la réponse fournie, mais assurez-vous d'en avoir une.

1

Cette erreur peut également se produire si vous utilisez CodeFile = "MyControl.ascx.cs" dans votre MyControl.ascx au lieu de CodeBehind = "MyControl.ascx.cs".

Dans le cas de CodeFile, le compilateur 2.0 essaie de recompiler la page, même si vous avez un WebProject au lieu d'un site Web et bien sûr - échoue.

La modification du nom d'attribut en CodeBehind a résolu le problème dans mon cas.