Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在System.Linq.Expressions中切换不带大小写(但带有默认值)_C#_.net_Linq Expressions - Fatal编程技术网

C# 在System.Linq.Expressions中切换不带大小写(但带有默认值)

C# 在System.Linq.Expressions中切换不带大小写(但带有默认值),c#,.net,linq-expressions,C#,.net,Linq Expressions,我已尝试使用System.Linq.Expressions创建开关表达式: var value = Expression.Parameter(typeof(int)); var defaultBody = Expression.Constant(0); var cases1 = new[] { Expression.SwitchCase(Expression.Constant(1), Expression.Constant(1)), }; var cases2 = new SwitchCase[

我已尝试使用System.Linq.Expressions创建开关表达式:

var value = Expression.Parameter(typeof(int));
var defaultBody = Expression.Constant(0);
var cases1 = new[] { Expression.SwitchCase(Expression.Constant(1), Expression.Constant(1)), };
var cases2 = new SwitchCase[0];
var switch1 = Expression.Switch(value, defaultBody, cases1);
var switch2 = Expression.Switch(value, defaultBody, cases2);
但在最后一行我得到了一个例外:

需要非空集合。参数名称:cases

这一例外的原因是什么?这可能是一个错误吗

在C#中,仅带有“默认”部分的开关是正确的:

switch(expr) {
default:
  return 0;
}//switch

UPD:我已经向GitHub上的CoreFX回购提交了C#的
开关与
开关表达式之间没有完全的相似性。在另一个方向,考虑你可以有:

var value = Expression.Parameter(typeof(int));
var meth = Expression.Lambda<Func<int, string>>(
  Expression.Switch(
    value,
    Expression.Call(value, typeof(object).GetMethod("ToString")),
    Expression.SwitchCase(Expression.Constant("Zero"), Expression.Constant(0, typeof(int))),
    Expression.SwitchCase(Expression.Constant("One"), Expression.Constant(1, typeof(int)))),
    value
  ).Compile();
Console.WriteLine(meth(0)); // Zero
Console.WriteLine(meth(1)); // One
Console.WriteLine(meth(2)); // 2
重载,例如:

public static Expression SwitchOrDefault(Expression switchValue, Expression defaultBody, params SwitchCase[] cases)
{
  return SwitchOrDefault(switchValue, defaultBody, null, (IEnumerable<SwitchCase>)cases);
}
公共静态表达式SwitchOrDefault(表达式switchValue、表达式defaultBody、参数SwitchCase[]cases)
{
返回SwitchOrDefault(switchValue,defaultBody,null,(IEnumerable)cases);
}
然后可以添加等等


这将导致比我的pull请求总体上更为精简的
表达式
,因为它在no cases情况下完全切断了
开关
,只返回默认主体。如果您确实需要一个
SwitchExpression
,那么您可以创建一个类似的helper方法,它遵循与pull请求相同的逻辑,创建一个新的
SwitchCase
,然后使用它。

这种构造的目标是什么
switch
带有
default
和no
case
只会执行
default
对我来说,没有case的开关看起来毫无意义,所以我认为这个例外是合理的。是的,C#spec说开关块有零个或多个开关段;但这并不意味着switch表达式必须与C#spec兼容。由于在运行时创建表达式,因此作为一种解决方法,您可以简单地添加一个
表达式。SwitchCase
的值为!=开关量;或者将默认情况的主体添加为value=switch value的switch case。@AndyKorneyev虽然我想不出有多少理由使用C#等价物,但我肯定可以看到这在动态创建开关时是多么有用;如果根据某些条件,您将有一个数量可变的
开关盒
s,则不必对其为零的情况进行特殊处理。@JonHanna是的,这正是我的情况。
public static Expression SwitchOrDefault(Expression switchValue, Expression defaultBody, params SwitchCase[] cases)
{
  return SwitchOrDefault(switchValue, defaultBody, null, (IEnumerable<SwitchCase>)cases);
}