Модель программирования в V4 является новой и не использует контроллеры. Вместо этого вы создаете класс, реализующий IBot
, который вы затем регистрируете, используя idiomatic .NET Core API конфигурации во время запуска. В частности, вы звоните services.AddBot
в ConfigureServices
, а затем appBuilder.UseBotFramework()
в Configure
.
Вы можете взглянуть на Startup.cs
из «пустого» бота в сэмплах , чтобы увидеть пример этого.
Оттуда я предлагаю прочитать документацию «Как работают боты» для V4 , чтобы получить хороший общий обзор основных понятий, таких как повороты и контекст поворота, в V4.
Эрик Липперт уже ответил на этот вопрос лучше, чем я.
Ознакомьтесь с его серией статей о ковариации и контравариантности в C #
и
Как происходит общая ковариация в C # 4.0. & Contra-variance Implmeneted?
РЕДАКТИРОВАТЬ: Эрик указал, что он не говорит о согласованности возвращаемых типов, но я решил сохранить ссылку в этом ответе, потому что это классная серия статей, и кто-то может найти ее полезной при поиске вверх по этой теме.
Эта функция была запрошена , и почти 5 лет назад Microsoft ответила: «Спасибо, что записали это в журнал. Мы часто слышим этот запрос. Мы рассмотрим его в следующем выпуске. "
А теперь я процитирую Джона Скита, потому что это не был бы правильный ответ на StackOverflow без ответа Джона Скита.
заключается в реализации CLR
а не в какой-либо глубокой смысловой
причина - CLR, вероятно, нужно
знаю, собирается ли
быть возвращаемым значением, чтобы сделать
соответствующие вещи со стеком.
Тем не менее, это кажется немного жаль, в
с точки зрения элегантности. Я не могу сказать я
когда-либо чувствовал потребность в этом на самом деле
жизнь, и это было бы достаточно легко
подделать (до четырех параметров) в
.NET 3.5 просто написав конвертер
от Func
до Action
, Func
to Action
и т. д. Это немного мешает
хотя :)
Это так, вам просто нужно дождаться VS2010 / .Net 4.0.
Чтобы расширить ответ Джоэла, среда CLR уже давно поддерживает ограниченную дисперсию, но компилятор C # не использует их до версии 4.0 с новыми модификаторами «in» и «out». общие интерфейсы и делегаты. Причины сложны, и я бы запутался, пытаясь объяснить, но это не так просто, как кажется.
Повторное преобразование «защищенного внутреннего» метода в «открытый» метод; вы можете сделать это с помощью метода сокрытия:
public new void Foo(...) { base.Foo(...); }
(пока все аргументы и т. д. также общедоступны) - какое применение?