可以在C#中从开关案例中分配回报吗?

时间:2015-07-17 01:33:06

标签: c# switch-statement

我在C#switch语句中看到的所有示例如下

var variable, result; 

switch (variable) {
 case 1: result = somevalue; break;
 case 2: result = someothervalue; break;
}

但是,我想要像

这样的东西
var result = switch (variable) {
   case 1: return <somevalue>;
   case 2: return <someothervalue>;
  }

可能? (也许我需要break在案例中,但这是一个回报......)

4 个答案:

答案 0 :(得分:4)

return <somevalue>背后的基本思想是正确的,但switch控制语句,因此它不是return的值。你必须使它成为这样的方法:

dynamic SomeMethod(int variable)
{
   switch(variable)
   {
       case 1: return "text";
       case 2: return 5;

       // Or manually return something out of switch scope
       // because method have to return something
       default: return null;
   }
}

void Test()
{
    // Now you have a value assigned to an variable
    // that comes from SomeMethod
    // which is generated (selected) by switch
    var result1 = SomeMethod(1); // string
    var result2 = SomeMethod(2); // int
    var result3 = SomeMethod(123); // null
}

在这种情况下我还需要解释一下:方法不能return s 隐式类型(var),因为编译器不能猜猜return 类型是什么。但是您可以return dynamic现在类型将被更改为运行时。另外,您无法在dynamic中使用switch,因为它需要nullable类型。

如果你想要它简短(在方法中),可以用lambda创建一个匿名方法:)

var result =
    (Func<int, dynamic>)
    ( (x) =>
    {
        switch(x)
        {
            case 1: return "text";
            case 2: return 5;
            default: return null;
        }
    } // Lambda
    ) // Func<int, dynamic> (takes int parameters, returns dynamic value)
    (); // Call it and get return value to assign

但是我强烈建议您阅读一些文章,例如statementsmethodstypes ......

答案 1 :(得分:2)

如果您想要根据某些输入返回值,并且您将交换机视为可能的解决方案,请考虑使用字典。

db.execSQL("CREATE TABLE tablename ( _id INTEGER PRIMARY KEY AUTOINCREMENT ... ");

请注意,开关本身不会返回值。如果你想保存那个返回值,那么只需用字典的索引器执行查找,如图所示,存储引用,然后返回。

// populated with types and data that mean something
// to you. 
private IDictionary<int, string> _lookupDictionary; 

public string GetValue(int variable) {
    return _lookupDictionary[variable];

    // instead of 
    // switch (variable) { 
    //     case 1: 
    //         return <somevalue>; 
    //     case 2:
    //         return <someothervalue>; 
    //     ...
    //     case n-1: 
    //         return <somethingelse>; 
    //     case n: 
    //         return <finalsomething>; 
}

答案 2 :(得分:1)

考虑conditional operator

var result =
    variable == 1? <somevalue>:
    variable == 2? <someothervalue>:
    <defaultvalue>;

答案 3 :(得分:1)

在c#8.0中,您可以使用新的开关语法:

var area = figure switch 
{
    Line _      => 0,
    Rectangle r => r.Width * r.Height,
    Circle c when c.Radius == 0 => throw new ThrowSomeException(c),
    Circle c    => Math.PI * c.Radius * c.Radius,
    _           => throw new UnknownFigureException(figure)
};

您可以阅读有关新任here的更多信息。