У меня есть следующий метод, и Я хочу знать, есть ли что-то, что может быть заменено по умолчанию (void) ниже , потому что есть ошибка компилятора, которая говорит, что void недопустим:
private void applyDefaultsIfNecessary(ApplicationConfiguration configuration)
{
var defaults = new Dictionary<Predicate<ApplicationConfiguration>, Action<ApplicationConfiguration>>()
{
// { rule, action } - if rule is true, execute action
{ (c) => c.ConnectionString == null , (c) => c.ConnectionString = "foo" },
{ (c) => c.OutputExcelFilePath == null, (c) => c.ConnectionString = "bar" },
{ (c) => c.OutputDirectory == null, (c) => c.OutputDirectory = "baz" }
};
//Nothing to select, but we want to loop throough the dict and invoke action, if rule is true.
//It is a pity there is no extension method called DoForEach on collections.
defaults.Select((item) => item.Key.Invoke(configuration) ? item.Value.Invoke(configuration) : default(void) );
}
Я понимаю, что могу использовать оператор if-else вместо тернарного оператора (или что я мог бы вызвать фиктивный метод для возврата void). Кроме того, метод расширения Select не любит лямбда-выражения, которые возвращают void. Кажется, говорят, что тип не может быть выведен, но, конечно, если я укажу тип как этот, либо:
defaults.Select<ApplicationConfiguration, void>((item) => { if (item.Key.Invoke(configuration)) item.Value.Invoke(configuration); } );
Мне было любопытно с точки зрения разработки языка, почему у нас нет выражений, которые могут возвращать void, или типа данных для переменных void.