如何优化C#中解析捷克出生证号月份的if-else语句?
改写正确性判定
你的switch表达式改写是完全正确的,和原有if-else逻辑100%等价:
- 所有区间判断规则和原有分支完全对应,计算逻辑(减去对应偏移量)也完全一致
- 兜底分支抛出自定义异常的逻辑和原有else分支完全对齐
- 只要项目的C#语言版本确实是9.0及以上,这段代码的运行结果和原实现没有任何差异,而且可读性、简洁度都优于多分支if-else写法。
强制类型转换的原因
这是C#的基础类型规则导致的:
ushort属于16位无符号整型,属于小于32位整型的数值类型,C#规定所有小于int的数值类型在进行算术运算时,会自动类型提升为int类型参与计算。- 你代码里
RawMonth - 20、RawMonth - 50等运算,结果都会自动转为int类型,而你的ResolvedMonth属性要求返回ushort类型,int到ushort属于可能丢失精度的窄化转换,C#不允许隐式转换,所以必须手动添加强制类型转换(ushort)才能通过编译。 - 你可以注意到第一个分支直接返回
RawMonth不需要转换,就是因为它本身就是ushort类型,没有做算术运算,不存在类型提升的问题。
内容的提问来源于stack exchange,提问作者Vlastimil Burián
相关产品推荐
相关产品推荐

