Ошибка компилятора CS0123
Ни одна перегрузка для метода «метод» не соответствует делегату «делегат».
Не удалось создать делегат, поскольку не использовалась правильная сигнатура. Экземпляры делегата должны объявляться с такой же сигнатурой, как и в объявлении делегата.
Чтобы устранить эту ошибку, исправьте либо метод, либо сигнатуру делегата. Дополнительные сведения см. в разделе Делегаты.
Следующий пример приводит к возникновению ошибки CS0123.
// CS0123.cs delegate void D(); delegate void D2(int i); public class C < public static void f(int i) <>public static void Main() < D d = new D(f); // CS0123 D2 d2 = new D2(f); // OK >>
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Event Handler Делегат
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет метод, обрабатывающий событие, не имеющее данных.
public delegate void EventHandler(System::Object ^ sender, EventArgs ^ e);
public delegate void EventHandler(object sender, EventArgs e);
public delegate void EventHandler(object? sender, EventArgs e);
[System.Serializable] public delegate void EventHandler(object sender, EventArgs e);
[System.Serializable] [System.Runtime.InteropServices.ComVisible(true)] public delegate void EventHandler(object sender, EventArgs e);
type EventHandler = delegate of obj * EventArgs -> unit
[] type EventHandler = delegate of obj * EventArgs -> unit
[] [] type EventHandler = delegate of obj * EventArgs -> unit
Public Delegate Sub EventHandler(sender As Object, e As EventArgs)
Параметры
Объект, не содержащий данных события.
Примеры
В следующем примере показано событие с именем ThresholdReached , связанное с делегатом EventHandler . Метод, назначенный делегату EventHandler , вызывается в методе OnThresholdReached .
using namespace System; public ref class ThresholdReachedEventArgs : public EventArgs < public: property int Threshold; property DateTime TimeReached; >; public ref class Counter < private: int threshold; int total; public: Counter() <>; Counter(int passedThreshold) < threshold = passedThreshold; >void Add(int x) < total += x; if (total >= threshold) < ThresholdReachedEventArgs^ args = gcnew ThresholdReachedEventArgs(); args->Threshold = threshold; args->TimeReached = DateTime::Now; OnThresholdReached(args); > > event EventHandler^ ThresholdReached; protected: virtual void OnThresholdReached(ThresholdReachedEventArgs^ e) < ThresholdReached(this, e); >>; public ref class SampleHandler < public: static void c_ThresholdReached(Object^ sender, ThresholdReachedEventArgs^ e) < Console::WriteLine("The threshold of was reached at .", e->Threshold, e->TimeReached); Environment::Exit(0); > >; void main() < Counter^ c = gcnew Counter((gcnew Random())->Next(10)); c->ThresholdReached += gcnew EventHandler(SampleHandler::c_ThresholdReached); Console::WriteLine("press 'a' key to increase total"); while (Console::ReadKey(true).KeyChar == 'a') < Console::WriteLine("adding one"); c->Add(1); > >
using System; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < Counter c = new Counter(new Random().Next(10)); c.ThresholdReached += c_ThresholdReached; Console.WriteLine("press 'a' key to increase total"); while (Console.ReadKey(true).KeyChar == 'a') < Console.WriteLine("adding one"); c.Add(1); >> static void c_ThresholdReached(object sender, ThresholdReachedEventArgs e) < Console.WriteLine("The threshold of was reached at .", e.Threshold, e.TimeReached); Environment.Exit(0); > > class Counter < private int threshold; private int total; public Counter(int passedThreshold) < threshold = passedThreshold; >public void Add(int x) < total += x; if (total >= threshold) < ThresholdReachedEventArgs args = new ThresholdReachedEventArgs(); args.Threshold = threshold; args.TimeReached = DateTime.Now; OnThresholdReached(args); >> protected virtual void OnThresholdReached(ThresholdReachedEventArgs e) < EventHandlerhandler = ThresholdReached; if (handler != null) < handler(this, e); >> public event EventHandler ThresholdReached; > public class ThresholdReachedEventArgs : EventArgs < public int Threshold < get; set; >public DateTime TimeReached < get; set; >> >
open System type ThresholdReachedEventArgs(threshold, timeReached) = inherit EventArgs() member _.Threshold = threshold member _.TimeReached = timeReached type Counter(threshold) = let mutable total = 0 let thresholdReached = Event() member this.Add(x) = total = threshold then let args = ThresholdReachedEventArgs(threshold, DateTime.Now) thresholdReached.Trigger(this, args) [] member _.ThresholdReached = thresholdReached.Publish let c_ThresholdReached(sender, e: ThresholdReachedEventArgs) = printfn $"The threshold of was reached at ." exit 0 let c = Counter(Random().Next 10) c.ThresholdReached.Add c_ThresholdReached printfn "press 'a' key to increase total" while Console.ReadKey(true).KeyChar = 'a' do printfn "adding one" c.Add 1
Module Module1 Sub Main() Dim c As Counter = New Counter(New Random().Next(10)) AddHandler c.ThresholdReached, AddressOf c_ThresholdReached Console.WriteLine("press 'a' key to increase total") While Console.ReadKey(True).KeyChar = "a" Console.WriteLine("adding one") c.Add(1) End While End Sub Sub c_ThresholdReached(sender As Object, e As ThresholdReachedEventArgs) Console.WriteLine("The threshold of was reached at .", e.Threshold, e.TimeReached) Environment.Exit(0) End Sub End Module Class Counter Private threshold As Integer Private total As Integer Public Sub New(passedThreshold As Integer) threshold = passedThreshold End Sub Public Sub Add(x As Integer) total = total + x If (total >= threshold) Then Dim args As ThresholdReachedEventArgs = New ThresholdReachedEventArgs() args.Threshold = threshold args.TimeReached = DateTime.Now OnThresholdReached(args) End If End Sub Protected Overridable Sub OnThresholdReached(e As ThresholdReachedEventArgs) RaiseEvent ThresholdReached(Me, e) End Sub Public Event ThresholdReached As EventHandler(Of ThresholdReachedEventArgs) End Class Class ThresholdReachedEventArgs Inherits EventArgs Public Property Threshold As Integer Public Property TimeReached As DateTime End Class
Комментарии
Модель событий в платформа .NET Framework основана на наличии делегата события, который соединяет событие с его обработчиком. Чтобы вызвать событие, требуются два элемента:
- Делегат, определяющий метод, предоставляющий ответ на событие.
- При необходимости класс, содержащий данные события, если событие предоставляет данные.
Делегат — это тип, определяющий сигнатуру, то есть тип возвращаемого значения и типы списка параметров для метода. Тип делегата можно использовать для объявления переменной, которая может ссылаться на любой метод с той же сигнатурой, что и делегат.
Стандартная сигнатура делегата обработчика событий определяет метод, который не возвращает значение. Первый параметр этого метода имеет тип Object и ссылается на экземпляр, который вызывает событие . Второй параметр является производным от типа EventArgs и содержит данные события. Если событие не создает данные события, вторым параметром является просто значение EventArgs.Empty поля. В противном случае второй параметр является типом, производным от EventArgs , и предоставляет все поля или свойства, необходимые для хранения данных события.
Делегат EventHandler — это предопределенный делегат, который представляет метод обработчика событий для события, которое не создает данные. Если событие создает данные, необходимо использовать универсальный EventHandler класс делегата.
Чтобы связать событие с методом, который будет обрабатывать событие, добавьте экземпляр делегата в событие . Обработчик событий вызывается всякий раз, когда происходит событие, если делегат не удален.
Дополнительные сведения о делегатах обработчика событий см. в разделе Обработка и вызов событий.
Методы расширения
Получает объект, представляющий метод, представленный указанным делегатом.
Нет перегруженного метода, который соответствует делегату
Что делать? — для начала указать что за ошибка и почему вы думаете, что каллбек для таймера вдруг будет принимать строку как параметр.
25 авг 2018 в 11:00
Нет перегруженного метода для «Switch», который соответствует делегату «TimerCallback»
25 авг 2018 в 11:12
Ну то есть вам прямо текстом написано что не так — сигнатура вашего Switch не совпадает с тем, что ожидает каллбек таймера. Согласно докам метод должен быть void и принимать параметр как object , а у вас вместо объекта — строка.
25 авг 2018 в 11:30
да и логика вашего Switch непонятна — почему вы решили, что таймер, которому дела нет до каких то команд, вдруг начнет посылать команды в метод Switch ? Он этого делать сам не будет, вам надо писать какую то доп логику для того, чтобы в ваш метод посылались команды, что вы хотите
25 авг 2018 в 11:32
ну тогда вам нужен метод, что принимает object как параметр (а уже в этом методе вызывайте что хотите) + вам надо будет сделать таймер полем класса, иначе GC его уничтожит. И это вроде все, что вам необходимо для решения вашей задачи.
C нет перегруженного метода который соответствует делегату
в чем ошибка компиляции??
Добавлено 08.03.11, 14:35
В идеале он должен менять местами поля Text кнопок, если в одном из полей пустая строка и если имя кнопки с которой предстоит обмен button15 или button12.
Вы че это на каждую кнопку вешаете свой код для смены??
Сообщ. #3 , 08.03.11, 14:35
Unregistered
Не удалось найти имя типа или пространства имён «EventHandler»
Добавлено 08.03.11, 14:37
Да, я не знаю как автоматизировать то, чтобы обмен разрешался только соседним кнопкам. Их в принципе всего 16 — так что это не большая проблема.
Сообщ. #4 , 08.03.11, 14:39

Рейтинг (т): 202
using System;
Сообщение отредактировано: maxim84_ — 08.03.11, 14:40
Сообщ. #5 , 08.03.11, 14:49
Unregistered
есть.
на другом форуме говорят, что это из-за
private void button17_Click(object sender, EventArgs e, Button _b)
Что надо Butto_b убрать. А где его тогда объявить?
Сообщ. #6 , 08.03.11, 14:56

Рейтинг (т): 202
конечно убрать. нет такого эвента
Что куда передать?? для чего этот аргумент вообще?
Добавлено 08.03.11, 15:02
ужасть ))
у вообще у контролов есть такая штука как Tag, он имеет тип object, а значит туда можно затолкать все что угодно, и использовать в наших целях. Итак:
всем кнопка программно задаем индекс в свойство Tag и попутно подсовываем обработчик нажатия: