Подтвердить что ты не робот

Создание свойства .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" решило его. Спасибо, ребята!

4b9b3361

Ответ 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