首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我可以强制一个非穷举的c#切换表达式导致编译错误吗?

在C#中,切换表达式(switch expression)是一种用于根据不同的条件执行不同代码块的结构。它在C# 8.0及更高版本中引入,可以更简洁地替代传统的switch语句。

切换表达式的语法如下:

代码语言:txt
复制
result = expression switch
{
    value1 => result1,
    value2 => result2,
    ...
    _ => defaultResult
};

在切换表达式中,expression是要进行判断的表达式,value1、value2等是可能的值,result1、result2等是与每个值对应的结果。最后的_表示默认情况,如果expression的值不匹配任何已定义的值,将返回defaultResult。

由于切换表达式是在编译时进行求值的,因此不能在切换表达式中使用非常量的值或方法调用等。如果尝试在切换表达式中使用非穷举的条件,编译器将会报错。

例如,假设我们有一个枚举类型的变量color,我们想根据不同的颜色执行不同的操作:

代码语言:txt
复制
Color color = GetColor();

string result = color switch
{
    Color.Red => "红色",
    Color.Blue => "蓝色",
    _ => "其他颜色"
};

在上述示例中,color的值将根据不同的情况进行判断,并返回相应的结果。如果color的值不是红色或蓝色,将返回"其他颜色"。

总结:在C#中,切换表达式是一种用于根据不同条件执行不同代码块的结构。它在编译时进行求值,因此不能在切换表达式中使用非穷举的条件,否则会导致编译错误。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 人工智能平台(AI Lab):https://cloud.tencent.com/product/ailab
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 区块链服务(Tencent Blockchain):https://cloud.tencent.com/product/tencentblockchain
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C#4.0新增功能01 动态绑定 (dynamic 类型)

但是,对于 dyn + 3,不会报告任何错误。 在编译时不会检查包含 dyn 表达式,原因是 dyn 类型为 dynamic。 ?...这样,开发人员将能够在动态行为和动态行为之间切换。 任何对象都可隐式转换为动态类型,如以下示例所示。...在以下示例中,如果唯一可访问 exampleMethod2 方法定义为接受字符串参数,则将 d1 作为参数发送不会导致编译错误,但却会导致运行时异常。...这样,就必须显式强制转换值,以便与 C#强类型变量保持协调。...如果使用 /link(C# 编译器选项)选项进行编译,则可以通过引入 dynamic 类型将 COM 签名中出现 object 看作是 dynamic 类型,从而避免大量强制转换。

1.7K30

C# 可空类型

通过使用可空引用类型,开发人员可以更早地捕捉到潜在空引用问题,从而减少了因为空引用而引起错误。...但是,如果你确定一个可空类型变量在某一点上肯定不会为空,你可以使用 !.运算符 来断言它空性。...这个操作叫做null断言操作符,它告诉编译器:“知道这个可空类型变量在这里绝对不是null,放心让使用它”。 例如,如果有一个可空整数变量 int?...运算符 应该小心谨慎,因为如果变量在使用时为null,会导致运行时异常。 以下是使用!.运算符方式: 强制断言可空类型为空值: int?...; // Do something with nonNullable }; 在Lambda表达式或委托中,可以使用!.运算符来断言参数为空。 C#可空类型会有性能问题

28350
  • C# 可为空引用类型

    难道不是所有引用类型都可为空C# 钟爱有加,认为它严谨语言设计非常棒。尽管如此,就目前而言,即使在 C# 版本 7 发布后,此语言也仍称不上完美。...将引用类型设为默认不可为空 将标准引用声明(无可为空修饰符)切换为不可为空,也许是减少可为空特性所有要求中最难实现一个。...; 这样一来,可以重写静态流分析,就像可以使用显式强制转换一样。当然,在运行时,仍会进行相应验证。 总结 引入引用类型为空性修饰符不是引入新类型。引用类型仍可为空,并且编译 string?...此外,在该属性可用前提下,旧版 C#可以引用 C# 8.0 编译库,尽管没有任何为空性改进。...运算符(声明“相信我,是程序员”),就像使用强制转换一样。

    18120

    C# 8.0 中模式匹配

    首先,注意这段代码没有进行任何类型强制转换,并且可以在事例上下文中使用刚匹配 apple。与 is 关键字一样,这也会匹配派生 apple。...最终苹果就是既非绿色也棕色所有苹果。 你还会发现,如果得到橘子,就会剥掉橘皮。并不局限于处理一种特定类型;只要这些类型都继承自 fruit,就都可以处理。...例如,现在可以引入表达式体成员,其中包含这些 switch 表达式一个,它还利用了模式匹配强大功能,如下所示: public Fruit Fruit { get; set; } public...如果你查看元组、解构和所谓递归模式组合,C# 8.0 中对模式匹配更改就会非常明显。 表达模式 递归模式是指一个模式匹配表达式输出变为另一个模式匹配表达式输入。...最后,还有可以使用位置模式元组模式,并且使用它可以组合用于运行匹配元组。可以一个场景来说明这一点,在这个场景中根据开门、关门以及锁门等不同状态进行操作(见图 4)。

    1.9K10

    尝试Java,从入门到Kotlin(下)

    除了常见lambda,map,filter,reduce之外,还吸收了ruby一些如对象上下文切换、代码块语法糖等便捷特性(但是也可能导致代码可读性下降)。 对JetBrain信任。...Kotlin不仅有纯函数类型,还可以通过Receiver声明类方法类型。这个特性可以用来实现类方法扩展、this切换功能。...强制编译Java代码,后编译Kotlin代码,可以解决这个问题,但是又会有新问题:你不能在Java代码中调用Kotlin代码。...Kotlinnull safety特性其实只是一个编译特性,通过将null与其他类型区分开来,在类型检查时候顺便检查了可能出现NullPointerException,但是在运行时Nullable...由于Nullable类型不被赋值为null值(废话),导致这些类型变量可能会没有默认值!这是个严重问题。

    22630

    论编程界日经问题:到底如何区分静态类型和动态类型、强类型和弱类型?

    语法糖不是弱类型 经过上面的介绍,你可能会联想到 Java 在字符串连接时可以有不同类型,例如: String a = 1 + "" // "1" 或者在 Python 中,也可以在流程控制表达式中使用...var 关键字来声明一个变量,而不是显式声明变量类型,是想表明一个观点:动态类型和变量类型推断是完全不同两个东西,虽然 Java 提供了 var 关键字让我们可以无须显式指定一个变量类型,但是该变量类型依然在编译期就会被确定下来...;上例 a 变量类型被推断为 int,因此就不能再被赋值为 java.lang.String 对象,所以产生了编译错误。...当然,这里我们还需要讨论几个边界情况: C# dynamic 关键字 C# 存在一个 dynamic 关键字,使用 dynamic 关键字标注变量类型推断和函数调用检查都会被从编译期推迟到运行时...讨论之末,有人问了一个很有意思问题:“一直想知道了解语言 typing system 分类对工程应用有什么帮助”,这确实引发了一些思考,即使我们争论喋喋不休,又或者终于达成了某种共识,那么这种结果对我们工程开发有什么实际意义

    35440

    C# 学习笔记(16)—— 动态类型

    这是因为在第 3 行,变量i类型是动态类型,编译具体类型只能在程序运行时被确定,编译器根本不知道其类型时什么,所以也就不会出现编译错误C# 为什么要引入动态类型 可以减少强制类型转换使用 从上面代码示例可以看出引入动态类型好处了...动态类型是在运行时被确定,使用它可以避免代码进行强制类型转换,从而使代码看起来更简洁 调用 Python 等动态语言 动态类型除了可以减少强制类型转换外,还可以C#语言中调用Python这样动态语言...然而并非在任何时候都可以用动态类型来做这种替代,动态类型使用需要满足以下几个约束条件 不能用来调用扩展方法 不能用动态类型作为参数来调用扩展方法,例如下面的代码将导致编译错误: var numers...= Enumerable.Range(10, 10); dynamic number = 4; var error = numbers.Take(numer); // 编译错误 错误原因很简单:扩展方法在另一个文件被定义...: dynamic lambdarestrict = x => x + 1; // 编译错误 如果硬要把 Lambda 表达式定义为动态类型,就需要明确指定委托类型,具体解决方案如下: dynamic

    18310

    必备 .NET - C# 异常处理

    catch 块必须按从最具体到最笼统顺序显示(同样假设不含 C# 6.0 异常条件),以免出现编译错误。例如,将 catch(Exception...)...块添加到其他所有异常之前会导致编译错误,因为之前所有异常都源自继承链上某处 System.Exception。另请注意,catch 块不要求使用命名参数。...对于 C# 6.0 及更高版本,catch 块可以使用额外条件表达式C# 6.0 支持条件子句,不再限制 catch 块是否只能根据异常类型进行匹配。...图 1 中 System.Web.HttpException 块通过相等比较运算符展示了这一功能。 使用异常条件有趣结果是,当有异常条件时,编译器不会强制 catch 块按继承链中顺序显示。...增加复杂性仅仅是,catch 块是否匹配由类型和异常条件组合决定,并且编译器只会强制实施与不带异常条件 catch 块相关顺序。

    2.4K60

    C# 7.3新特性一览

    C# 7.3把其中部分检查移到了重载解析期间,而不是重载解析之后,这样,错误匹配就不会导致编译错误。...泛型约束:枚举、委托和托管 自C# 2.0引入泛型以来,开发人员就一直在抱怨,无法把一个泛型类型指定为枚举。这个问题终于解决了,你现在可以使用enum关键字作为泛型约束了。...在C# 7.3中,你可以在创建数组时对其初始化,就像你对普通数组所做那样。该提案没有提供细节,但微软正考虑预初始化一个主数组,当函数被调用时可以快速复制。...C# 7.3把其中部分检查移到了重载解析期间,而不是重载解析之后,这样,错误匹配就不会导致编译错误。...泛型约束:枚举、委托和托管 自C# 2.0引入泛型以来,开发人员就一直在抱怨,无法把一个泛型类型指定为枚举。这个问题终于解决了,你现在可以使用enum关键字作为泛型约束了。

    1.2K30

    C Sharp(五)

    C Sharp(五) 發佈於 2018-10-23 这一篇,我们讲讲 C#表达式和运算符。 运算符 ---- 运算符(操作符)是一个符号,表示返回单个结果操作。...一个操作符: 将操作数作为输入 执行某个操作 基于该操作返回一个可以作为操作数结构有: 字面量 常量 变量 方法调用 元素访问器 其他表达式 字面量 C# 中字面量有: 整数字面量: 1024...: 后缀 L,被编译成长整型 后缀 U,被编译成无符号整型 整型字面量还可以写成十六进制形式,以 0x 或 0X 开头。...我们可以为自己类或者结构定义隐式转换和显式转换: 对于隐式转换,编译器会自动执行转换 对于显式转换,编译器只有在使用显式转换运算符时才会转换 声明隐式转换语法: //一定要有 public static...break; //错误 } 我们可以使用 foreach 遍历数组中元素,就像 Objective-C 中 forin 一样。

    82320

    【深入浅出C#】章节 2:数据类型和变量:类型转换和类型推断

    转换操作符 在C#中,我们可以使用自定义转换操作符来定义显示类型转换。转换操作符是一种特殊方法,用于将一个类型转换为另一个类型。...否则可能导致运行时异常或错误结果。...var关键字适用场景和限制 var 关键字在以下情况下适用: 初始化表达式提供了足够信息来推断变量类型。 使用匿名类型或复杂类型名称会导致代码冗长,而 var 关键字可以简化代码。...注意事项: 缺乏编译时类型检查:使用动态类型时,编译器无法提供类型检查和编译错误检测。因此,需要在运行时仔细处理类型错误,并进行适当错误处理。...三、类型转换和类型推断最佳实践 在进行类型转换和类型推断时,以下是一些最佳实践可以考虑: 显式类型转换谨慎使用:显式类型转换(强制类型转换)应该谨慎使用,因为它可能会导致数据丢失或运行时异常。

    42410

    C#5.0新增功能01 异步编程

    可以使用 CPU 绑定代码(例如执行成本高昂计算),对编写异步代码而言,这是一个不错方案。C# 拥有语言级别的异步编程模型,它使你能轻松编写异步代码,而无需应付回叫或符合支持异步库。...在 C# 方面,编译器将代码转换为状态机,它将跟踪类似以下内容:到达 await 时暂停执行以及后台作业完成时继续执行。 从理论上讲,这是异步承诺模型实现。...如果 await 未用在 async 方法主体中,C# 编译器将生成一个警告,但此代码将会以类似普通方法方式进行编译和运行。...请注意这会导致效率低下,因为由 C# 编译器为异步方法生成状态机将不会完成任何任务。 应将“Async”作为后缀添加到所编写每个异步方法名称中。...采用阻止方式编写等待任务代码 将阻止当前线程作为等待任务完成方法可能导致死锁和已阻止上下文线程,且可能需要更复杂错误处理。

    2.3K20

    C# 9.0新特性介绍

    这些优点在使用共享数据并发程序中更为明显。 遗憾是,C# 强制编写大量额外代码来创建不可变引用类型。Record为不可变引用类型提供类型声明,该引用类型使用值语义实现相等性。...; 应用程序中只有一个文件可使用顶级语句。 如果编译器在多个源文件中找到顶级语句,则是错误。 如果将顶级语句与声明程序入口点方法(通常为 Main 方法)结合使用,也会出现错误。...4、模式匹配增强功能 C# 9 包括新模式匹配改进: 类型模式要求在变量是一种类型时匹配 带圆括号模式强制或强调模式组合优先级 联合 and 模式要求两个模式都匹配 析取 or 模式要求任一模式匹配...类似的功能可改进条件表达式目标类型解析。进行此更改后,两个表达式无需从一个隐式转换到另一个,而是都可隐式转换为目标类型。你可能不会注意到此更改。...你会注意到,某些以前需要强制转换或无法编译条件表达式现在可以正常工作。从 C# 9.0 开始,可将 static 修饰符添加到 Lambda 表达式或匿名方法。

    2K20

    Java中String强转int:一种常见错误和解决方法

    哈喽,大家好,是木头左!引言在Java编程中,经常需要将字符串转换为整数。然而,当尝试将一个包含数字字符字符串强制转换为整数时,会引发NumberFormatException异常。...在实际编程中,应该尽量避免将包含数字字符字符串强制转换为整数,以免引发异常。同时,也学习了使用异常处理机制、正则表达式验证和异常信息进行提示等方法,以解决String强转int问题。...答:使用异常处理机制可以捕获异常并进行相应处理,避免程序崩溃,并提供友好错误提示。 使用正则表达式验证有什么好处? 答:使用正则表达式验证可以确保字符串只包含数字字符,提高转换准确性和可靠性。...结语通过本文介绍,了解了Java中String强转int常见错误和解决方法。在实际编程中,应该尽量避免将包含数字字符字符串强制转换为整数,以免引发异常。...答:使用异常处理机制可以捕获异常并进行相应处理,避免程序崩溃,并提供友好错误提示。 使用正则表达式验证有什么好处? 答:使用正则表达式验证可以确保字符串只包含数字字符,提高转换准确性和可靠性。

    51610

    可空值类型

    2.2.3 语言层面支持 如果当初C# 2发布时只提供了struct类型约束来让编译器只知道可空值类型,简直不可想象。C#团队完全可以给可空值类型特性提供这种最基本支持。...= null) if (x.HasValue) 对于书写习惯上偏好,自己也很难一以贯之。不是说保持一致编码风格不重要,只是就这部分内容来说,确实影响不大。可自由切换编码风格,无须考虑兼容性问题。...等价运算 和关系运算符可以保证返回类型是非可空布尔型。进行等价操作时,两个null被视作相等,而一个null和任意一个null值是不相等。...上述规则中有一个重点需要强调:如果第1个操作数类型是可空值类型,同时第2个操作数是第1个操作数对应可空值类型,整个表达式类型就是该可空值类型。例如以下代码是合法:int?...b; 以上代码中,a是可空值类型,表达式a ?? b可以不经类型转换直接赋值给可空类型c。这样赋值之所以合法,是因为b是非可空,所以整个表达式返回值将不可能为null。另外,??

    2.3K30

    C#学习笔记七: C#4.0中微小改动-可选参数,泛型可变性

    这就是可选参数好用之处, 特别是对于一个系统后期维护很好使用, 在真实项目中也使用过这样用法, 如下例: 在我们做系统中切换User有SwitchUser(不lougout当前user,然后添加新...,在.Net 4.0之前版本肯定会编译错误, 25 // 大家可以把项目的目标框架改为.Net Framework 3.5或者更加低级版本 26 // 这样下面这行代码就会出现编译错误...要让编译器通过, 我们必须使用强制类型转换, 把object转换为int. 即obj = (int)obj + 10; 但是动态类型引入到底有什么好处呢? 1,可以减少强制类型转换使用....动态类型除了可以减少强制类型转换外, 还可以让我们在C#语言中调用Python这样动态语言. 这里对动态类型介绍不多, 主要是介绍了一个dynamic关键字, 如果以后用到再来百度就好了....听说 Are you out of your mind? 你疯了吗? Are you pulling my leg? 你在开玩笑? As far as I'm concerned. 就而言

    1.4K80

    .NET基础拾遗(2)面向对象实现和异常处理基础

    一、面向对象实现 1.1 C#可以多继承?   在C#中申明一个类型时,只支持单继承(即继承一个父类),但支持实现多个接口(Java也是如此)。...在C#程序中,构造方法调用虚方法是一个需要避免禁忌,这样做到底会导致什么异常?...在C#中,当一个类型被构造时,它构造顺序是这样: 执行变量初始化表达式 → 执行父类构造方法(需要的话)→ 调用类型自己构造方法 我们可以通过以下代码示例来看看上面的构造顺序是如何体现:...其根本方法就在于:永远不要在叶子类构造方法中调用虚方法。 1.4 C#如何声明一个类不能被继承?   ...这是一个被问烂问题,在C#可以通过sealed关键字来申明一个不可被继承类,C#将在编译阶段保证这一机制。但是,继承式OO思想中最重要一环,但是否想过继承也存在一些问题呢?

    61210

    C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第二部分

    你能给我们描述一下? Hejlsberg: 好,认为我们现在所说面向组件类特点是极为重要。我们努力做到没有其他方法可以做这件事情。...VB 和 C# 在同一个程序员群体里是相互竞争。C++ 扮演这一个特别的角色,可是C++核心是写托管代码,是相对底层编程。...泛型也是现实编程世界里解决方法好帮手。 对,有更多类型是很好,这意味着你可以更快发现错误,因为只有很少运行时动态检查程序类型,因此你可以写出很好代码来。...这也就是为什么泛型可以在运行时候表现出来。 而 Java 则选择了另一个不同方式实现泛型,一言以蔽之,他们是在编译时实现。...说了这么多,总之,可以通过反射在编译时候,在运行时候来实现上述功能,这是一个巨牛功能呀。

    86831

    --03:控制流

    一些语言例外规定求值顺序(Java和C#都是规定从左至右求值顺序)。如果没有这种强制规定,编译器就可适当安排出一些高效代码指令,但是也有可能会带来棘手副作用问题。...实际上这种情况下短路求值已经改变了布尔表达式语义,如果短路求值,那么在func不存在情况下去执行func(),程序是会抛出错误。...(如果从这个角度来看,goto这种在结构化编程时代可以任意跳转东西拿到结构化时代是必然会导致问题,因为一部分代码已经被抽象封装成一个隐藏复杂实现细节函数了,以goto变态能力是会打破这种封装...如果是无意间修改,那么这种错误很则难定位;如果是有意修改,则会导致理解上难度。 可以用个goto跳出跳入这种循环,比如在i没有争取初始化时就跳入循环这种错误编译器却没办法察觉到。...笔者认为C#也是这种实现机制(虽说C#有yield语句,但是却只是一个编译语法糖而已),以前写过一篇C#中迭代器博客,可以点这里查看。

    2K100

    【《Effective C#》提炼总结】提高Unity中C#代码质量21条准则

    《Effective C# Second Edition》一书原本有50条原则,但这50条原则是针对C#语言本身以及.NET来写在阅读过程中,发现是有些原则并不适用于Unity中mono版本C#...原则3 推荐使用is 或as操作符             而不是强制类型转换 ● C#中,is和as操作符用法概括如下: is : 检查一个对象是否兼容于其他指定类型,并返回一个Bool值,永远不会抛出异常...2)该类型公有接口都是由访问其数据成员属性定义? 3)你确定该类型绝不会有派生类型? 4)你确定该类型永远都不需要多态支持?...3)由于回调和委托在C#中非常常用,以至于C#特地以lambda表达式形式为其提供了精简语法。 4)由于一些历史原因,.NET中委托都是多播委托(multicast delegate)。...原则20 避免返回对内部类对象引用 ● 若将引用类型通过公有接口暴露给外界,那么对象使用者即可绕过我们定义方法和属性来更改对象内部结构,这会导致常见错误

    1.7K30
    领券