2016-06-19 5 views
1

Я работаю над боттовым чатом и в классе Command.cs, я наткнулся на странную проблему. У меня есть один конструктор, который принимает Action<string, User, Channel> и тот, который принимает Func<string, User, Channel, bool>. Первый конструктор должен назвать второй с Func, который вызывает Action и возвращает true. Это работало нормально, когда я использовал 7 параметров в обоих конструкторах, но как только я добавил 8-й, он прекратил компиляцию.Несоответствие между Func и Action с различным количеством параметров конструктора?

Ошибка, которую я получаю, это CS8030 «Анонимная функция, преобразованная в возвращаемый делегат void, не может вернуть значение». но до того, как я добавил 8-й параметр, код компилировался просто отлично

Единственное различие между двумя фрагментами заключается в том, что я добавил дополнительный параметр description.

перед:

public class Command 
{ 
    public Command(string name, Action<string, User, Channel> action, bool adminOnly = false, bool modOnly = false, bool ownerOnly = false, bool hasUserCooldown = true, TimeSpan? cooldown = null, bool allowOtherCommands = false) 
     : this(name, (m, u, c) => { action(m, u, c); return true; }, adminOnly, modOnly, ownerOnly, hasUserCooldown, cooldown) 
    { 

    } 

    public Command(string name, Func<string, User, Channel, bool> action, bool adminOnly = false, bool modOnly = false, bool ownerOnly = false, bool hasUserCooldown = true, TimeSpan? cooldown = null, bool allowOtherCommands = false) 
    { 

    } 
} 

public class User { } 
public class Channel { } 

после:

public class Command 
{ 
    public Command(string name, Action<string, User, Channel> action, bool adminOnly = false, bool modOnly = false, bool ownerOnly = false, bool hasUserCooldown = true, TimeSpan? cooldown = null, bool allowOtherCommands = false, string description = null) 
     : this(name, (m, u, c) => { action(m, u, c); return true; }, adminOnly, modOnly, ownerOnly, hasUserCooldown, cooldown, description) 
    { 

    } 

    public Command(string name, Func<string, User, Channel, bool> action, bool adminOnly = false, bool modOnly = false, bool ownerOnly = false, bool hasUserCooldown = true, TimeSpan? cooldown = null, bool allowOtherCommands = false, string description = null) 
    { 

    } 
} 

public class User { } 
public class Channel { } 

Большое спасибо.

+0

Не вижу никакой разницы между вашим до и после кода, хотя. – Rahul

+0

@Rahul Я добавил параметр в самом конце конструктора «string description = null» после allowOtherCommands – four

ответ

1

В обеих версиях вы забыли передать необязательный параметр allowOtherCommands второму методу. Хотя в первом методе это просто логическая ошибка, которая не может быть захвачена компилятором, во втором случае параметр description заставляет компилятор сопоставлять вызов тому же конструктору, который ожидает Action, следовательно, ошибка.

Просто пройти все необязательные параметры, и проблема будет решена:

public Command(string name, Action<string, User, Channel> action, 
    bool adminOnly = false, bool modOnly = false, bool ownerOnly = false, bool hasUserCooldown = true, 
    TimeSpan? cooldown = null, bool allowOtherCommands = false, string description = null) 
    : this(name, (m, u, c) => { action(m, u, c); return true; }, 
     adminOnly, modOnly, ownerOnly, hasUserCooldown, 
     cooldown, allowOtherCommands, description) 
{ 

} 
+0

большое спасибо – four