gpt4 book ai didi

c# - C# lambda 表达式是否可以返回 void?

转载 作者:可可西里 更新时间:2023-11-01 08:53:38 28 4
gpt4 key购买 nike

我有以下方法,我想知道下面是否有任何可以放在 default(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 的 lambda。好像是说不能推断类型,当然如果我这样指定类型,要么:

defaults.Select<ApplicationConfiguration, void>((item) => { if (item.Key.Invoke(configuration)) item.Value.Invoke(configuration); } );

从语言设计的角度来看,我很好奇,为什么我们没有可以返回 void 的表达式或 void 变量的数据类型。

最佳答案

请参阅规范的第 7.1 节,其中指出:

[An expression may be classified as] "nothing". This occurs when the expression is an invocation of a method with a return type of void. An expression classified as nothing is only valid in the context of a statement expression.

[强调已添加]。

也就是说,唯一可以使用返回 void 的方法调用的表达式是当表达式构成整个语句时。像这样:

M();

关于c# - C# lambda 表达式是否可以返回 void?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2029433/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com