Ошибка C#: «Не удается преобразовать «int» в «System.Func<Creature, int>»»

Пожалуйста, помогите мне с этим вопросом. Я кодирую систему способностей в Unity3D 2019.4.1 (если вы хотите знать) и создал класс «Roller» для некоторых случайных чисел. Есть

public static Func<Creature, int> OnNumberRolled;

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

public class ListenerEffect : Effect
{
   public int OnRolledOne(Creature creature)
   {
      ...
   }

   public override void CastEffect(ITargetable caster, ITargetable target)
   {
       Creature localCasterCreature = caster as Creature;
       Roller.OnNumberRolled += OnRolledOne(localTargetCreature);
   }
}

В данный момент

Roller.OnNumberRolled += OnRolledOne(localTargetCreature);

возникает ошибка. В нем говорится, что он не может преобразовать «int» в «System.Func<Creature, int>». Оба класса используют System. Что я должен делать?

Пожалуйста, прочитайте о событиях в C# и о том, как они работают.

Ian Kemp 11.12.2020 15:21

В вашем примере OnRolledOne(localTargetCreature) выполнит функцию и вернет и int. Вот почему вы не можете назначить его OnNumberRolled, который ожидает Func<Create,int>.

Felipe Faria 11.12.2020 15:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто используйте имя функции. В противном случае вы вызываете функцию и используете возвращаемое значение.

    Roller.OnNumberRolled += OnRolledOne;

Если вы добавите несколько обработчиков, имейте в виду, что возвращаемые значения будут потеряны (но последнее) при вызове как OnNumberRolled().

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

Вы также можете перебирать обработчики следующим образом:

var handlers = OnNumberRolled.GetInvocationList();

foreach (var handler in handlers)
{
      // invoke and handle each handlers'result here
      Debug.Log(handler());
}

Хммм... Я хочу активировать несколько вещей из одного события. Я думаю, что Roller.OnNumberRolled = OnRolledOne перезапишет другую логику. Есть ли способ сделать это?

MrWatchmanLP 11.12.2020 15:19

Вы можете использовать +=. Это называется состав делегата

Emanuel Vintilă 11.12.2020 15:19

Иш. Ваш делегат возвращает int. Если вы создаете делегата многоадресной рассылки с помощью +=, все возвращаемые значения, кроме значения от последнего вызываемого делегата, теряются.

canton7 11.12.2020 15:26

@MrWatchmanLP Я добавил версию delegate / event, но да, имейте в виду комментарий canton7. Например, вы можете захотеть, чтобы ваши обработчики событий добавляли результат в какой-то список, но это может очень быстро превратиться в спагетти-код.

Pac0 11.12.2020 15:31

Спасибо всем, ребята. Это мне очень помогло!

MrWatchmanLP 11.12.2020 15:34

@EmanuelVintilă да, действительно, но нужно использовать делегатов, а не только System.Func, я обновил свой ответ.

Pac0 11.12.2020 15:39

@Pac0 System.Func — тип делегата

Emanuel Vintilă 11.12.2020 16:48

@EmanuelVintilă Ха, спасибо. Теперь я чувствую себя тупым, не замечая этого так долго ... снова отредактировал ответ.

Pac0 11.12.2020 16:55

Другие вопросы по теме