#c_sharp
Есть интерфейс intefrace IMy { void say(String msg); } Есть класс class My { IMy iMy; public My() { iMy = (str) = > Console.WriteLine(str); //ошибка iMy.say("Text"); } } На строке с //ошибка мне пишет Cannot convert lambda expression to type IMy, because it is not a delegate type Что мне надо изменить в коде, чтобы я мог инициализировать переменную iMy моим способом? P.S. сам пишу на java, и там такая конструкция работает. Какая аналогичная конструкция в c#?
Ответы
Ответ 1
Судя по примеру использования вместо интерфейса в данном случае можно использовать делегат Action, например так class My { Action iMy; public My() { iMy = (str) => Console.WriteLine(str); //ок iMy("Text"); } } Ответ 2
Чтобы класс обладал заданным интерфейсом, он должен наследовать этот интерфейс и реализовать методы, которые объявлены в интерфейсе. Ниже показана демонстрационная программа using System; using System.Collections.Generic; namespace Simple_interface { interface IMy { void Say(string msg); } class A1: IMy { public void Say( string msg ) => Console.WriteLine( nameof( A1 ) + ": " + msg ); } class A2: IMy { public void Say(string msg) => Console.WriteLine(nameof( A2 ) + ": " + msg); } class Program { static void Main(string[] args) { Listlist = new List { new A1(), new A2() }; foreach (var item in list) item.Say("is called"); } } } Ее вывод на консоль A1: is called A2: is called Имейте в виду, что данный кол будет компилироваться для версии C# 6. Вы можете ознакомиться с новыми возможностями C#, посмотрев это видео
Комментариев нет:
Отправить комментарий