Создание свойства .NET "должно объявлять тело, потому что оно не отмечено абстрактной или внешней" ошибкой компиляции
У меня есть веб-приложение .NET 3.5 (target framework). У меня есть код, который выглядит так:
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" решило его. Спасибо, ребята!
Ответы
Ответ 1
добавить в 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>
Ответ 2
Ваш код действителен - он должен работать нормально. Перейдите на страницы свойств вашего проекта и убедитесь, что "Target Framework" - это .NET 3.0 или 3.5.
Ответ 3
Синтаксис действителен. И вы можете установить различные модификаторы доступа. Вы не на интерфейсе, не так ли? И класс, в котором они находятся, не является абстрактным?
Кроме того, не имеет значения, какой v. целевой среды вы нацеливаете, потому что это функция компилятора. VS2008 реализует свойство w/backing store для вас.
Ответ 4
Вы правы; этот стиль разрешен.
Я бы посмотрел на стандартные сборки, на которые ссылались. Я не уверен, что вам нужно будет скомпилировать, но, по-моему, вы указываете на версию csc.exe.Net v2.0.
Ответ 5
Эта ошибка не должна исходить из кода, который вы опубликовали. Согласно MSDN, вы сделали это правильно: http://msdn.microsoft.com/en-us/library/bb384054.aspx
Следовательно, я бы рекомендовал вам повторно проверить сообщение об ошибке и где компилятор говорит, что ошибка исходит. Текст сообщения, который вы отправили, не содержит ссылки на свойства, а также есть аналогичное сообщение для функций... Все, что отсутствует в реализации, а не на интерфейсе или помечены тегом abstract или extern, может генерировать эту ошибку.
Авто-свойство является особенностью языка С# 3.0/компилятора. Если вы используете VS 2008, он должен работать, даже если вы нацеливаете .NET 2.0. Я ПРОСТО тестировал его, чтобы убедиться.
Ответ 6
Эта ошибка также может произойти, если вы используете CodeFile= "MyControl.ascx.cs" в MyControl.ascx вместо CodeBehind= "MyControl.ascx.cs".
В случае CodeFile компилятор 2.0 пытается перекомпилировать страницу, даже если у вас есть WebProject вместо WebSite, и, конечно же, не выполняется.
Изменение имени атрибута CodeBehind устраняет проблему в моем случае.
Ответ 7
Где вы определяете это свойство? Непосредственно в файле * x или в кодеBehind? (Я не думаю, что это может быть причиной, но если build-Target -.NET 3.5, я ничего не вижу)
Ответ 8
Это также происходит в проекте исходного веб-сайта, где не было создано web.config.
Несмотря на то, что файл решения сказал 3.5,.Net необходимо, чтобы web.config заявлял, что он также распознает. Я запускал debug, позволяя ему создавать webconfig, и все работало.
Итак, это похоже на предоставленный ответ, но просто убедитесь, что у вас есть.
Ответ 9
Это, пока вы ставите abstract впереди или реализуете методы.
public abstract string LogPath { get; private set; }
public abstract string ErrorMsg { get; private set; }
См. http://forums.asp.net/t/1031651.aspx