Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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# 在Switch表达式中是否有跳过或继续的方法,或者每个分支是否都需要返回某些内容?_C#_.net - Fatal编程技术网

C# 在Switch表达式中是否有跳过或继续的方法,或者每个分支是否都需要返回某些内容?

C# 在Switch表达式中是否有跳过或继续的方法,或者每个分支是否都需要返回某些内容?,c#,.net,C#,.net,仅当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

仅当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
});
List derivedObjects=new()
添加(baseObject开关
{
当d.field!=1=>d时,derivedType d,
_=>//这里我会放一些类似“继续”的东西,但它不被接受
});
有类似的可能吗

在这里,我会放一些东西,比如
continue

继续
,开关表达式是一个表达式,它必须返回一些内容

C#中唯一的例外是允许抛出这些表达式(
switch
表达式、条件表达式等),就像函数允许抛出而不是返回值一样。所以你可以这样做,事实上这是一种非常常见的模式:

derivedObjects.Add(baseObject switch
{
    derivedType d when d.field != 1 => r,
    _ => throw new InvalidOperationException()
});
编辑:以防您不知道,实际上有一种更简单的方法来编写代码,而不必在时使用

derivedObjects.Add(baseObject switch
{
    derivedType { field: not 1 } d => r,
    _ => throw new InvalidOperationException()
});

最好使用switch语句,而不是switch表达式

List derivedObjects=new()
开关(基本对象)
{
当d.field!=1时,案例派生类型d:
衍生对象。添加(d);
打破
违约:
打破
}
即,当值符合要求时,添加它,否则不添加。但由于只有一个有效的case,if语句似乎比switch语句更合适。当不在案例标签内时,必须使用
is
关键字引入模式:
baseObject is pattern\u expression

在C#9.0中,您还可以使用新的

case-derivedType{field:<1或>1}d:

不清楚此代码试图做什么。它可能是试图按类型筛选对象列表的代码片段。它可能是基于类型插入单个对象的尝试。或者完全不同的东西

如果目的是按类型过滤对象列表,则可以使用LINQ过滤并创建最终列表:

var derivedObjects= baseObjects.OfType<DerivedObject>()
                               .Where(d=>d.Field !=1)
                               .ToList();

所有表达式都必须返回一个值。在默认情况下,
Add
会做什么?使用LINQ会更容易/更清晰吗?或者我遗漏了什么吗?
baseObject
来自哪里?如果它来自列表或IEnumerable,则
Where().Select().ToList()
可以替换此代码。如果只有一个实例,最好使用
If子句
,如果条件满足,则只使用
Add
succeeded@maccettura不知道如何使用LINQ,你能发布答案吗,我可以接受。抱歉,我还在学习。这很像是想把一个方形的钉子塞进一个圆孔。switch表达式的美妙之处在于,它们确实能为每种情况提供回报。如果这不是您想要实现的,那么您选择了错误的peg。最好使用
If
并且不要添加任何内容。如果您的用例中出现了条件失败的情况,那么在某些情况下,您必须使用自定义代码来支持每个单独的项目(如这里的示例),任何你不支持的都是一个错误,不能默默忽略。在这个问题上,似乎所有可能的C#9功能都被使用了,不管它们是否合适。
var derivedObjects= baseObjects.OfType<DerivedObject>()
                               .Where(d=>d.Field !=1)
                               .ToList();
if(baseObject is DerivedType d && d.Field !=1)
{
    derivedObjects.Add(d);
}