C# Expression.Switch()在案例实现中遇到困难

C# Expression.Switch()在案例实现中遇到困难,c#,expression,C#,Expression,我正在尝试实现表达式.Switch()以在表达式中创建Switch语句。我在努力解决一些问题 我创建了一个引发异常的小示例。开关使用字符串切换案例,并在该案例中分配一个变量 下面是一些将引发异常的代码: // an int variable var var1 = Expression.Parameter(typeof(int)); // a string variable var var2 = Expression.Parameter(typeof(string)); var cases =

我正在尝试实现
表达式.Switch()
以在表达式中创建Switch语句。我在努力解决一些问题

我创建了一个引发异常的小示例。开关使用字符串切换案例,并在该案例中分配一个变量

下面是一些将引发异常的代码:

// an int variable
var var1 = Expression.Parameter(typeof(int));
// a string variable
var var2 = Expression.Parameter(typeof(string));

var cases = new[] 
{ 
    // the first case 'SwitchCaseValue1' should write the int value 1 into variable var1
    Expression.SwitchCase(Expression.Assign(var1, Expression.Constant(1)), Expression.Constant("SwitchCaseValue1")),
    // the second case 'SwitchCaseValue2' should write the string value 'Example' into variable var2 
    Expression.SwitchCase(Expression.Assign(var2, Expression.Constant("Example")), Expression.Constant("SwitchCaseValue2"))
};

Expression.Switch(Expression.Constant("SwitchValue"), cases);
这将引发此异常:
所有案例正文和默认正文必须具有相同的类型。

我认为这是指
Assign
为案例1返回一个int,为案例2返回一个字符串我怎么能什么都不退?


如果我将
var2
更改为int类型:

// an int variable
var var1 = Expression.Parameter(typeof(int));
// a string variable
var var2 = Expression.Parameter(typeof(int));

var cases = new[] 
{ 
    // the first case 'SwitchCaseValue1' should write the int value 1 into variable var1
    Expression.SwitchCase(Expression.Assign(var1, Expression.Constant(1)), Expression.Constant("SwitchCaseValue1")),
    // the second case 'SwitchCaseValue2' should write the string value 'Example' into variable var2 
    Expression.SwitchCase(Expression.Assign(var2, Expression.Constant(2)), Expression.Constant("SwitchCaseValue2"))
};

Expression.Switch(Expression.Constant("SwitchValue"), cases);
它引发异常:
如果案例正文不是System.Void,则必须提供默认正文。

所以我改了:最后一行是
Expression.Switch(Expression.Constant(“SwitchValue”),Expression.Constant(0),cases)

这将编译。但这不是我想要的…


是否有其他方法可以修复第一个解决方案,而无需执行额外的代码来返回相同的类型?

我不喜欢选择无意义的返回值这样的解决方案,比如:

// an int variable
var var1 = Expression.Parameter(typeof(int));
// a string variable
var var2 = Expression.Parameter(typeof(string));

var cases = new[] 
{ 
    // the first case 'SwitchCaseValue1' should write the int value 1 into variable var1
    Expression.SwitchCase(
        Expression.Block( 
            Expression.Assign(var1, Expression.Constant(1)), 
            // return a boolean
            Expression.Constant(true)), 
        Expression.Constant("SwitchCaseValue1")),
    // the second case 'SwitchCaseValue2' should write the string value 'Example' into variable var2 
    Expression.SwitchCase(
        Expression.Block( 
            Expression.Assign(var2, Expression.Constant("Example")), 
            // return a boolean
            Expression.Constant(true)), 
        Expression.Constant("SwitchCaseValue2"))
};


Expression.Switch(Expression.Constant("SwitchValue"), Expression.Constant(false), cases);


我理解表达式和返回值的逻辑。但是有没有办法避免实现无意义的代码呢?

我自己找到了答案

Expression.Switch()
有一个重载
开关(类型类型、表达式switchValue、表达式defaultBody、方法信息比较、IEnumerable cases)

使用此重载并将
typeof(void)
传递到参数
type
时,它将接受它

msdn:“SwitchExpression对象中的所有SwitchCase对象必须具有相同的类型,除非SwitchExpression的类型为void。”我没有在SwitchExpression类型和包含类型参数的重载之间建立连接

这将完成以下工作:

// an int variable
var var1 = Expression.Parameter(typeof(int));
// a string variable
var var2 = Expression.Parameter(typeof(string));

var cases = new[] 
{ 
    // the first case 'SwitchCaseValue1' should write the int value 1 into variable var1
    Expression.SwitchCase(
            Expression.Assign(var1, Expression.Constant(1)), 
            Expression.Constant("SwitchCaseValue1")),
    // the second case 'SwitchCaseValue2' should write the string value 'Example' into variable var2 
    Expression.SwitchCase(
            Expression.Assign(var2, Expression.Constant("Example")), 
            Expression.Constant("SwitchCaseValue2"))
};

Expression.Switch(typeof(void), Expression.Constant("SwitchValue"), null, null, cases);