локальная функция должна объявить тело так как она не помечена

C # «должен объявлять тело, потому что оно не помечено как абстрактное, внешнее или частичное»

Я не уверен, почему я получаю эту ошибку, если честно.

Я также пробовал просто создать собственное свойство:

8 ответов

Я подозреваю, что вы хотите, чтобы это было:

При этом я бы также подумал об упрощении этого кода. Вероятно, лучше использовать исключения, а не MessageBox внутри вашего установщика свойств для недопустимого ввода, поскольку это не привяжет вас к определенной структуре пользовательского интерфейса.

Вы не можете предоставить свою собственную реализацию для установщика при использовании автоматических свойств. Другими словами, вам следует либо сделать:

или предоставьте свою собственную реализацию как для геттера, так и для сеттера, что вы и хотите, судя по вашему примеру:

Вам нужно либо предоставить тело для геттера и сеттера, либо ни то, ни другое. Поскольку у вас есть нетривиальная логика в вашем сеттере, вам понадобится реализованный вручную геттер, например:

Если вы решите, что вам не нужна логика в сеттере, вы можете использовать автоматически реализуемое свойство, например:

Вам НЕ нужно предоставлять тело для геттеров и сеттеров, ЕСЛИ вы хотите, чтобы автоматизированный компилятор обеспечивал базовую реализацию.

Однако это требует от вас убедиться, что вы используете компилятор v3.5, обновив свой web.config до чего-то вроде

Я получил такое же сообщение об ошибке, потому что у меня была функция с параметром с зарезервированным словом.

Переименование делегата переменной решило проблему.

Для этого вы можете просто использовать значение ключевой работы.

И решилась удалением «;» из строки метода:

Частный статический void swapMth (ref int x, ref int y); ПРОБЛЕМА

Private static void swapMth (ref int x, ref int y) РЕШЕН

Я знаю, что это основная ошибка, надеюсь, кому-то поможет эта записка.

Источник

.NET свойство генерации «необходимо объявить тело, поскольку оно не помечено абстрактной или extern» ошибка компиляции

это дает мне эту ошибку компиляции для этих строк:

изменение этого на » 3.5 » решило его. Спасибо, ребята!

9 ответов

добавить в web.config

синтаксис. И вы можете установить различные модификаторы доступа. Вы не на интерфейс ты? А класс это не аннотация это?

кроме того, не имеет значения, какой v. фреймворка вы нацеливаете, потому что это функции компилятора. VS2008 реализует свойство w / backing stores для вас.

вы правы; этот стиль разрешен.

эта ошибка не должна исходить из кода, который вы опубликовали. Согласно MSDN, вы сделали это правильно:http://msdn.microsoft.com/en-us/library/bb384054.aspx

поэтому я бы рекомендовал вам повторно проверить сообщение об ошибке и где компилятор говорит, что ошибка исходит. Текст опубликованного сообщения не содержит ссылки на свойства, и аналогичное сообщение имеется для функций. Все, что отсутствует в реализации, а не на интерфейс или помеченные абстрактные или extern может создать эту ошибку.

эта ошибка также может произойти, если вы используете CodeFile= » MyControl.ascx вносятся.cs » в вашем MyControl.ascx и вместо CodeBehind= » MyControl.ascx вносятся.цезий.»

изменение имени атрибута CodeBehind Исправлена проблема в моем случае.

Это также происходит в проекте необработанного веб-сайта, где не было интернета.сгенерированная конфигурация.

Так это как ответ, но просто убедитесь, что у вас есть.

Читайте также:  можно ли использовать метод группировки когда важна последовательность картинок или слов

Это, как долго, как вы положите аннотация спереди, или реализовать методы.

Источник

Анализируем локальные функции в C# 7

Добавление локальных функций в языке C# первоначально для меня было излишним. Прочитав статью в блоге SergeyT, я понял, что эта фича действительна нужна. Итак, кто сомневается в надобности локальных функций и кто еще не знает что это, вперед за знаниями!

Локальные функции — это новая возможность в C# 7, которая позволяет определять функцию внутри другой функции.

Когда использовать локальные функции?

Основная идея локальных функций очень похожа на анонимные методы: в некоторых случаях создание именованной функции слишком дорого с точки зрения когнитивной нагрузки на читателя. Иногда функциональность, по своей сути, является локальной для другой функции, и нет смысла загрязнять «внешнюю» область видимости отдельной именованной сущностью.

Вы можете подумать, что эта возможность избыточна, потому что такое же поведение может быть достигнуто с анонимными делегатами или лямбда-выражениями. Но это не всегда так. Анонимные функции имеют определенные ограничения, и их характеристики производительности могут быть непригодными для ваших сценариев.

Пример использования 1: предварительные условия в блоках итератора

Вот простая функция, которая читает файл по строкам. Вы знаете, когда будет выброшено ArgumentNullException?

Методы с yield return в теле являются особыми. Они называются блоками итератора, и они ленивы (lazy). Это означает, что выполнение этих методов происходит «по требованию», и первый блок кода в них будет выполняться только тогда, когда клиент метода вызовет MoveNext на результирующем итераторе. В нашем случае это означает, что ошибка произойдет только в методе ProcessQuery, потому что все LINQ-операторы тоже ленивы.

Очевидно, что такое поведение нежелательно, потому что метод ProcessQuery не будет иметь достаточной информации о контексте ArgumentNullException. Поэтому было бы неплохо бросить исключение сразу — когда клиент вызывает ReadLineByLine, но не тогда, когда клиент обрабатывает результат.

Чтобы решить эту проблему, нам нужно извлечь логику проверки в отдельный метод. Это хороший кандидат на анонимную функцию, но анонимные делегаты и лямбда-выражения не поддерживают блоки итераторов (*):

(*) Лямбда-выражения в VB.NET могут иметь блок итератора.

Пример использования 2: предварительные условия в асинхронных методах

Асинхронные методы имеют аналогичную проблему с обработкой исключений: любое исключение, созданное методом, помеченным ключевым словом async, проявляется в возвращенной задаче:

Вы можете подумать, что при возникновении ошибки нет большой разницы. Но это далеко от истины. Неисправная задача (faulted task) означает, что сам метод не смог выполнить то, что он должен был сделать. Неисправная задача означает, что проблема заключается в самом методе или в одном из блоков, от которых зависит метод.

Проверка надежных предварительных условий особенно важна, когда результирующая задача передается по системе. В этом случае было бы очень трудно понять, когда и что пошло не так. Локальная функция может решить эту проблему:

Пример использования 3: локальная функция с блоками итератора

Мне было очень досадно, что нельзя использовать итераторы внутри лямбда выражений. Вот простой пример: если вы хотите получить все поля в иерархии типов (включая закрытые), вам нужно пройти иерархию наследования вручную. Но логика обхода специфична для конкретного метода и должна быть максимальная «локализованной»:

Читайте также:  лиза возвратилась домой села в ногах своей кровати и так просидела до самого вечера

Пример использования 4: рекурсивный анонимный метод

Анонимные функции по умолчанию не могут ссылаться на саму себя. Чтобы обойти это ограничение, вы должны объявить локальную переменную с типом делегата, а затем захватить эту локальную переменную внутри лямбда-выражения или анонимного делегата:

Этот подход не очень читабелен, и следующее решение с локальной функцией кажется более естественным:

Пример использования 5: когда вопросы аллокации имеют значение

Если локальная функция захватывает локальную переменную или аргумент, то компилятор C# генерирует специальную структуру замыкания, создает ее экземпляр и передает ее по ссылке в сгенерированный статический метод:

Локальная функция может захватывать экземплярное состояние, локальные переменные (***) или аргументы. Никакой аллокации в управляемой куче не произойдет.
(***) Локальные переменные, используемые в локальной функции, должны быть определены (definitely assigned) в месте объявления локальной функции.

Есть несколько случаев, когда произойдет создание объекта в управляемой куче:

1. Локальная функция явно или неявно преобразуется в делегат.
Аллокация делегата произойдет если локальная функция захватывает поля экземплярные или статические поля, но не захватывает локальные переменные или аргументы.

Аллокация замыкания и делегата произойдет, если локальная функция захватывает локальные/аргументы

2. Локальная функция захватывает локальную переменную/аргумент, а анонимная функция захватывает переменную/аргумент из той же области видимости.
Этот более тонкий случай.

Компилятор C # генерирует отдельный тип замыкания для каждой лексической области видимости (аргументы метода и локальные переменные верхнего уровня находятся в одной и той же области верхнего уровня). В следующем случае, компилятор будет генерировать два типа замыкания:

Два разных лямбда-выражения используют один и тот же тип замыкания, если они захватывают переменные из одной и той же области видимости. Сгенерированные методы для лямбда-выражений a и b находятся в одном и том же типе замыкания:

В некоторых случаях такое поведение может вызвать некоторые очень серьезные проблемы, связанные с памятью. Вот пример:

Кажется, что переменная o должна быть доступна для сборки мусора сразу после вызова делегата a(). Но это не так, поскольку два лямбда-выражения используют один и тот же тип замыкания:

Это означает, что время жизни экземпляра замыкания привязано к времени жизни поля func: замыкания остается живым до тех пор, пока делегат доступен из кода приложения. Это может продлить время жизни VeryExpensiveObject, что по сути является своеобразной утечкой памяти.

Аналогичная проблема возникает, когда локальная функция и лямбда-выражение захватывают переменные из одной и той же области видимости. Даже если они захватывают разные переменные, тип замыкания будет общим, вызывая выделение объекта в управляемой куче:

Будет преобразовано компилятором в:

Как вы можете видеть, все локальные переменные из верхней области видимости теперь становятся частью класса замыкания, что приводит к созданию объекта-замыкания, даже когда локальная функция и лямбда-выражение захватывают разные переменные.

Локальные функции 101

Источник

Автоматические свойства В C# 3-Необходимо объявить тело для get, если я объявляю его для set?

вот ошибка, которую я получаю при попытке компиляции:

AMSDataModels.Транспорт.Вин.get ‘ должен объявить тело, потому что оно не помечено как абстрактное, внешнее или частичное

Если я удалю тело из набора так, чтобы его просто:

Читайте также:  курумник что это такое фото

все работает, но я теряю способность проверьте VIN, как он установлен.

у кого-нибудь есть предложение как это исправить или лучший способ подойти к проблеме под рукой?

4 ответов

Если вы собираетесь добавить логику в набор, вам также нужно добавить ее в get. Обратите внимание, что в вашем наборе вы на самом деле не устанавливаете значение для чего-либо?

добавить резервное поле,

и верните это в get.

при использовании автоматических свойств компилятор автоматически генерирует поле сторонника. Когда вы объявляете свой собственный, он не может знать, какое поле использовать для метода get. Поэтому вы должны объявить и то, и другое.

Кстати, Ваш текущий метод set проверяет только значение-он никогда не назначает его ничему.

да, вам также придется объявить реализацию get. Ох, и ваш код не делает ничего, кроме проверки. Для этого Вам также потребуется предоставить дополнительную реализацию, предполагая, что вы хотите установить значение, если оно пройдет проверку.

Если вам нужно что-то большее, чем просто базовая реализация get/set, вам придется реализовать все свойство, а не только разницу.

вам придется использовать хорошее поле поддержки. Короткая нотация не может быть смешана. Единственное дополнительное удовольствие-изменить модификатор доступа на get и set, например get; private set;

Источник

Метод должен объявить тело?

Проектируйте и реализуйте класс струнного музыкального инструмента, используя следующие рекомендации:

Поля данных для вашего инструмента должны включать в себя количество строк, массив строковых имен, представляющих имена строк (например, E, A, D, G) и логические поля, чтобы определить, настроен ли инструмент, и если инструмент в данный момент воспроизводится. Если хотите, вы можете добавить дополнительные поля данных.

Метод конструктора, который настроил настроенные и в настоящее время воспроизводящие поля на false. Другие методы

Другие методы по вашему мнению (добавьте хотя бы один уникальный метод).

Создайте диаграмму классов UML с помощью инструмента диаграммы (например, PPT, Visio) по вашему выбору. Подготовьте диаграммы и поместите их в документ Word вместе с кратким описанием вашего класса.

Создайте класс С# для своего инструмента. Убедитесь, что ваш код соответствует вашим спецификациям дизайна, и некоторые минимальные функциональные возможности включены. Например, если вы вызвали метод violin.play(), вы должны хотя бы напечатать, что играет скрипка. Подобная функциональность должна предоставляться при прекращении воспроизведения, настройки или вызова любых ваших методов.

Но я получаю эту ошибку:

Ошибка 1 ‘StringedMusInsApp.Guitarra.Main(string [])’ должен объявить тело, потому что оно не отмечено абстрактным, внешним или частичным.

Сообщение об ошибке сообщает вам, что именно неправильно:

‘StringedMusInsApp.Guitarra.Main(string [])’ должен объявить тело, потому что оно не отмечено абстрактным, внешним или частичным.

Посмотрите на объявление метода для Main(string[]) :

Там нет тела метода. Но поскольку это не абстрактный, внешний или частичный метод, он требует тела метода. Определите:

Также обратите внимание, что если вы ничего не делаете в методе Main(string[]) ваше приложение ничего не сделает. Он будет сразу открываться и закрываться, не выполняя никакого кода. Main(string[]) метод является точкой входа для приложения.

Источник

Строй-портал