只有当 switch 表达式找到类似这样的内容时,我才想添加到列表中:
List<drivedType> derivedObjects = new()
derivedObjects.Add(baseObject switch
{
derivedType d when d.field != 1 => d,
_ => // Here I would put somthing like "continue" but it's not accepted
});
有什么可能吗?
目前尚不清楚这段代码试图做什么。它可能是尝试按类型过滤对象列表的代码片段。这可能是尝试根据类型插入单个对象。或者完全不同的东西。
如果打算按类型过滤对象列表,则可以使用 LINQ 过滤并创建最终列表:
var derivedObjects= baseObjects.OfType<DerivedObject>()
.Where(d=>d.Field !=1)
.ToList();
如果打算插入单个对象:
if(baseObject is DerivedType d && d.Field !=1)
{
derivedObjects.Add(d);
}
最好使用 switch 语句而不是 switch 表达式来完成
List<drivedType> derivedObjects = new()
switch(baseObject)
{
case derivedType d when d.field != 1:
derivedObjects.Add(d);
break;
default:
break;
}
即,当该值符合需要时,添加它,否则不添加。但是由于您只有一个有效案例,因此 if 语句似乎比 switch 语句更合适。is当不在 case 标签内时,您必须使用关键字来引入模式:baseObject is pattern_expression
在 C# 9.0 中,您还可以使用新的关系和析取模式
case derivedType { field: < 1 or > 1 } d:
在这里我会放一些东西
continue
不continue,switch 表达式是一个表达式,它必须返回一些东西。
C# 中的唯一例外是这些表达式(switch表达式、条件表达式等)被允许抛出,就像函数被允许抛出而不是返回值一样。所以你可以做这样的事情,确实这是一个非常常见的模式:
derivedObjects.Add(baseObject switch
{
derivedType d when d.field != 1 => r,
_ => throw new InvalidOperationException()
});
编辑:以防万一你不知道,实际上有一种更简单的方法来编写你的代码,没有那个when:
derivedObjects.Add(baseObject switch
{
derivedType { field: not 1 } d => r,
_ => throw new InvalidOperationException()
});