«Невозможно присвоить группе методов неявно типизированную локальную переменную» Создание калькулятора
Второй пост здесь, поэтому я недавно начал свой вычислительный курс, и мы работаем над С#. Я все время понял все, и у нас есть наш первый проект, над которым мы должны работать, однако я был здесь в тупике, я покажу вам все код для чтения, тогда я оторвусь внизу до той части, где обнаружена ошибка:
Итак, есть код формы, и вот ошибка, я прокомментирую точную строку
Есть ошибки, есть ли что-то еще, что вы можете видеть в этом не так? Или оптимизация? Это только для умножения, но как только я это сделал, я могу легко скопировать его, спасибо 🙂
Ошибка в точности, как говорит компилятор. Вы не можете использовать var при инициализации с помощью группы методов. Из документации, с моим акцентом:
var может использоваться только тогда, когда локальная переменная объявляется и инициализируется в той же самой инструкции; переменная не может быть инициализирована нулем, или группе методов или анонимной функции.
Вы должны явно указать тип переменной, если хотите инициализировать ее группой методов.
Однако довольно очевидно, что вы действительно не хотите назначать группу методов локальной переменной. Именно то, что вы пытаетесь сделать, я не могу отличить здесь.
Мне кажется, что вы не совсем поняли программирование, основанное на событиях. Вам нужно подождать, пока пользователь нажмет кнопку, а затем ответьте на эту кнопку, щелкнув в обработчике событий. Что нужно знать о обработчиках событий, так это то, что система их вызывает, а вы этого не делаете.
Невозможно присвоить значение так как он является группа методов
Опытный
Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина
Репутация: нет
Всего: нет
| Код |
| public interface IView < /// /// Вывод градусов Фаренгейта /// void SetFarenheit(double value); |
///
/// Вывод градусов Цельсия
///
void SetCelsius(double value);
///
/// Ввод нового значения градусов
///
double InputDegree
///
/// Событие ввода значения по Фаренгейту
///
event EventHandler SetFarenheit;
///
/// Событие ввода значения по цельсию
///
event EventHandler SetCelsius;
>
Тип «MVCExample.IView» уже содержит определение для «SetFarenheit» E:\С#\MVCExample\MVCExample\IView.cs 18 41 MVCExample
Тип «MVCExample.IView» уже содержит определение для «SetCelsius» E:\С#\MVCExample\MVCExample\IView.cs 19 41 MVCExample
Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург
Репутация: 18
Всего: 67
Опытный
Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина
Репутация: нет
Всего: нет
| Код |
| class Presenter < private Model _model=new Model(); private IView _view; |
public Presenter(IView view)
<
_view=view;
_view.SetCelsius+=new EventHandler (OnSetCelsius); //Невозможно присвоить «SetCelsius» значение, поскольку он является «группа методов»
_view.SetFarenheit+= new EventHandler (OnSetFarenheit);//И тут так же
private void OnSetFarenheit(object sender, EventArgs e)
<
_model.valueFanrenheit=_view.InputDegree;
RefreshView();
>
private void OnSetCelsius(object sender, EventArgs e)
<
_model.valueCelsius=_view.InputDegree;
RefreshView();
>
private void RefreshView()
<
_view.SetCelsius(_model.valueCelsius);
_view.SetFarenheit(_model.valueFanrenheit);
>
>
Опытный
Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина
Репутация: нет
Всего: нет



















| Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. [ Время генерации скрипта: 0.1075 ] [ Использовано запросов: 21 ] [ GZIP включён ] Невозможно присвоить ‘ ‘, потому что это новичок группы методовЯ занимаюсь на сеттеров и геттеров, получил это сообщение об ошибке:
4 ответаВам нужно установить имя, используя метод SetName. Ты используешь GetnewName как если бы это было свойство, но вы определили его как пару методов. Синтаксис свойства объединяет геттер и сеттер под одним именем. Затем C# перенаправляет присвоения установщику и читает метод получателя: Замечания: get => name Выше используется новый синтаксис. Старый синтаксис для того же был get Вы не можете присвоить строку методу, это вызывает ошибку. В C# мы не используем методы получения и установки, как в Java или C++. Вместо этого у нас есть свойства, которые мы используем. Вы можете назначать и читать значения, как если бы они были полями, но у них есть специальные методы, называемые методами доступа. Вы должны изменить свой класс следующим образом: Тогда вы можете использовать его как: Кажется, вы хотите этого: get; будет автоматически возвращать значение вашего свойства без необходимости в частном вспомогательном свойстве, и, как правило, вы можете использовать установщик внутри свойства для установки значения, но так как вам также нужно передать параметр, это похоже на создание установщика частный и создание отдельного метода, чтобы фактически установить его в соответствии с вашими потребностями. Я только начал работу с C#. Сейчас делаю тест. Структуру решил делать: есть массив с ключом к тесту, при нажатии на правильный объект в переменную записывалось +1. Имеется:1) 6 объектов Radiobutton; 2) массив который является ключом теста testKey =<'1','1','3','2','3'. > Вот никак у меня не получается связать номера оъектов нажатый в нужный момент к ключом-правильным вариантом ответа. Как связать radiobutton и label? Связать radiobutton-ы материнских плат и процессоров Нужно связать RadioButton и столбцы в таблице? Связать текстбокс с массивом Связать StringGrid с массивом Как связать элементы листбокса с массивом Checkbox index или как связать чекбокс с массивом Карманная книга по TypeScript. Часть 7. КлассыМы продолжаем серию публикаций адаптированного и дополненного перевода «Карманной книги по TypeScript «. Обратите внимание: для большого удобства в изучении книга была оформлена в виде прогрессивного веб-приложения. Члены класса (class members)Вот пример самого простого класса — пустого: Такой класс бесполезен, поэтому давайте добавим ему несколько членов. Поля (fields)Поле — это открытое (публичное) и доступное для записи свойство класса: Поля могут иметь инициализаторы, которые автоматически запускаются при инстанцировании класса: —strictPropertyInitializationНастройка strictPropertyInitialization определяет, должны ли поля класса инициализироваться в конструкторе. Обратите внимание, что поля классов должны быть инициализированы в самом конструкторе. TS не анализирует методы, вызываемые в конструкторе, для обнаружения инициализации, поскольку производный класс может перезаписать такие методы, и члены не будут инициализированы. readonlyКонструкторы (constructors)Конструкторы класса очень похожи на функции. Мы можем добавлять в них параметры с аннотациями типа, значения по умолчанию и перегрузки: Однако, между сигнатурами конструктора класса и функции существует несколько отличий: Конструкторы не могут иметь параметров типа — это задача возлагается на внешнее определение класса, о чем мы поговорим позже Конструкторы не могут иметь аннотацию возвращаемого типа — всегда возвращается тип экземпляра класса superМетоды (methods)Метод — это свойство класса, значением которого является функция. Методы могут использовать такие же аннотации типа, что и функции с конструкторами: Как видите, TS не добавляет к методам ничего нового. Геттеры/сеттерыКлассы могут иметь акцессоры (вычисляемые свойства, accessors): TS имеет несколько специальных правил, касающихся предположения типов в случае с акцессорами: Если set отсутствует, свойство автоматически становится readonly Параметр типа сеттера предполагается на основе типа, возвращаемого геттером Если параметр сеттера имеет аннотацию типа, она должна совпадать с типом, возвращаемым геттером Геттеры и сеттеры должны иметь одинаковую видимость членов (см. ниже) Сигнатуры индекса (index signatures)Классы могут определять сигнатуры индекса. Они работают также, как сигнатуры индекса в других объектных типах: Обычно, индексированные данные лучше хранить в другом месте. Классы и наследованиеКак и в других объектно-ориентированных языках, классы в JS могут наследовать членов других классов. implementsПредостережениеВажно понимать, что implements всего лишь проверяет, соответствует ли класс определенному интерфейсу. Он не изменяет тип класса или его методов. Ошибочно полагать, что implements изменяет тип класса — это не так! Также следует помнить о том, что определение в интерфейсе опционального свойства не приводит к созданию такого свойства: extendsКлассы могут расширяться другими классами. Производный класс получает все свойства и методы базового, а также может определять дополнительных членов. Перезапись методовTS обеспечивает, чтобы производный класс всегда был подтипом базового класса. Пример «легального» способа перезаписи метода: Важно, чтобы производный класс следовал контракту базового класса. Помните, что очень часто (и всегда легально) ссылаться на экземпляр производного класса через указатель на базовый класс: Что если производный класс не будет следовать конракту базового класса? Если мы скомпилируем этот код, несмотря на ошибку, такой «сниппет» провалится: Порядок инициализацииПорядок инициализации классов может быть неожиданным. Рассмотрим пример: Что здесь происходит? Порядок инициализации согласно спецификации следующий: Инициализация полей базового класса Запуск конструктора базового класса Инициализация полей производного класса Запуск конструктора производного класса Наследование встроенных типовДля такого подкласса: вы можете обнаружить, что: instanceof сломается между экземплярами подкласса и их экземплярами, поэтому ( new MsgError() ) instanceof MsgError возвращает false Видимость членов (member visibility)Мы можем использовать TS для определения видимости методов и свойств для внешнего кода, т.е. кода, находящегося за пределами класса. publicПоскольку public является дефолтным значением, специально указывать его не обязательно, но это повышает читаемость и улучшает стиль кода. protectedЗащищенные члены видимы только для подклассов класса, в котором они определены. Раскрытие защищенных членовПроизводные классы должны следовать контракту базового класса, но могут расширять подтипы базового класса дополнительными возможностями. Это включает в себя перевод protected членов в статус public : Доступ к защищенным членам за пределами иерархии классовРазные языки ООП по-разному подходят к доступу к защищенным членам из базового класса: privateЧастные члены похожи на защищенные, но не доступны даже в подклассах, т.е. они доступны только в том классе, где они определены. Поскольку частные члены невидимы для производных классов, производный класс не может изменять их видимость: Доступ к защищенным членам между экземплярамиTS разрешает такой доступ: ПредостережениеДля реализации «настоящих» частных членов можно использовать такие механизмы, как замыкания (closures), слабые карты (weak maps) или синтаксис приватных полей класса (private fields, # ). Статические члены (static members)В классах могут определеяться статические члены. Такие члены не связаны с конкретными экземплярами класса. Они доступны через объект конструктора класса: Статические члены наследуются: Специальные названия статических членовПочему не существует статических классов?В некоторых языках, таких как C# или Java существует такая конструкция, как статический класс (static class). Существование этих конструкций обусловлено тем, что в названных языках все данные и функции должны находиться внутри классов; в TS такого ограничения не существует, поэтому в статических классах нет никакой необходимости. Например, нам не нужен синтаксис «статического класса», поскольку обычный объект (или функция верхнего уровня) прекрасно справляются с такими задачами: Общие классы (generic classes)В классах, как и в интерфейсах, могут использоваться ограничения дженериков и значения по умолчанию. Параметр типа в статических членахСледующий код, как ни странно, является НЕлегальным: Значение this в классах во время выполнения кодаTS не изменяет поведения JS во время выполнения. Обработка this в JS может показаться необычной: TS предоставляет некоторые средства для изменения такого поведения. Стрелочные функцииЕсли у вас имеется функция, которая часто будет вызываться способом, приводящим к потере контекста, имеет смысл определить такое свойство в виде стрелочной функции: Это требует некоторых компромиссов: Значение this будет гарантированно правильным во время выполнения, даже в коде, не прошедшем проверки с помощью TS Будет использоваться больше памяти, поскольку для каждого экземпляра класса будет создаваться новая функция Параметры thisTS проверяет, что функция с параметром this вызывается в правильном контексте. Вместо использования стрелочной функции мы можем добавить параметр this в определение метода для обеспечения корректности его вызова: Данный подход также сопряжен с несколькими органичениями: Мы все еще имеем возможность вызывать метод неправильно Выделяется только одна функция для каждого определения класса, а не для каждого экземпляра класса Базовые определения методов могут по-прежнему вызываться через super Типы thisВ классах специальный тип this динамически ссылается на тип текущего класса: Мы также можем использовать this в аннотации типа параметра: Это отличается от other: Box — если у нас имеется производный класс, его метод sameAs будет принимать только другие экземпляры этого производного класса: Основанные на this защитники типаСвойства параметровВыражения классов (class expressions)Выражения классов похожи на определения классов. Единственным отличием между ними является то, что выражения классов не нуждаются в названии, мы можем ссылаться на них с помощью любого идентификатора, к которому они привязаны (bound): Абстрактные классы и членыКлассы, методы и поля в TS могут быть абстрактными. Абстрактным называется метод или поле, которые не имеют реализации. Такие методы и поля должны находится внутри абстрактного класса, который не может инстанцироваться напрямую. Абстрактные классы выступают в роли базовых классов для подклассов, которые реализуют абстрактных членов. При отсутствии абстрактных членов класс считается конкретным (concrete). Обратите внимание: если мы забудем реализовать абстрактных членов, то получим ошибку: Сигнатуры абстрактных конструкций (abstract construct signatures)Иногда нам требуется конструктор класса, создающий экземпляр класса, производный от некоторого абстрактного класса. Вместо этого, мы можем написать функцию, которая принимает нечто с сигнатурой конструктора: Теперь TS правильно указывает нам на то, какой конструктор может быть вызван — Derived может, а Base нет. Отношения между классамиВ большинстве случаев классы в TS сравниваются структурно, подобно другим типам. Например, следующие два класса являются взаимозаменяемыми, поскольку они идентичны: Также существуют отношения между подтипами, даже при отсутствии явного наследования: Однако, существует одно исключение. Пустые классы не имеют членов. В структурном отношении такие классы являются «супертипами» для любых других типов. Так что, если мы создадим пустой класс (не надо этого делать!), вместо него можно будет использовать что угодно: Облачные серверы от Маклауд быстрые и безопасные. Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации! |
