将变量设置为开关的结果

vbu*_*ger 16 .net c# switch-statement

我是疯了还是有办法在C#中将变量设置为开关的结果?就像是:

 var a = switch(b)
    {
     case c:
     d;
     case e:
     f;
     default:
     g;
    };
Run Code Online (Sandbox Code Playgroud)

是否可以使用任何其他语言?我只是认为它是,但我没有得到任何编译.提前致谢.

Jon*_*eet 25

不,c是一种陈述而不是可以评估的表达.

当然,您可以将其提取到另一种方法中:

var a = b switch
{
    c => d,
    e => f,
    _ => g
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用eif,它只是一个简单的常量映射的情况.如果您可以向我们提供有关您要实现的目标的更多信息,我们可以帮助您找出最实用的方法.

  • @VladislavStelmakh:是的,这是编写近 35,000 个答案的缺点之一 - 我无法在每次新功能出现时都浏览并更新它们...... (2认同)

Mar*_*ers 14

不,您不能将switch语句用作表达式.编写它的另一种方法是嵌套条件运算符:

var a = b == c ? d:
        b == e ? f:
                 g;
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 6

这在C#中是不可能的.

最接近的是将其移动到方法中,或者在每种情况下单独进行分配,即:

int a;
switch(b)
{
 case c:
     a = d; break;
 case e:
     a = f; break;
 default:
     a = g; break;
};
Run Code Online (Sandbox Code Playgroud)

是否可以使用任何其他语言?

是.例如,大多数函数式语言都支持类似的东西.例如,F#的模式匹配提供了一个(更强大的)版本.


Cor*_*sak 6

如果你不是特别关心效率,那么使用泛型来烹饪一个小类是很容易的,它允许你使用一个"流畅的"方法调用链,例如:

var a=Switch(b).Case(c).Then(d).Case(e).Then(f).Default(g);
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意,更紧凑

var a=Switch(b).Case(c, d).Case(e, f).Default(g);
Run Code Online (Sandbox Code Playgroud)

如果你对此感兴趣,我会很乐意做一个例子


Aba*_*ypt 6

我只是想补充一点,Jon Skeet 在这里的答案不会编译并导致错误,因为 C#8 开关分配需要用分号关闭。

var a = b switch
{
    c => d,
    e => f,
    _ => g
}; //<-- here
Run Code Online (Sandbox Code Playgroud)

/我缺乏在他的答案下评论这一点的声誉,但由于他是最佳答案,所以应该注意。/

我现在编辑了有问题的答案