C#中使用switch判断TimeOnly提示‘需常量值’的解决求助
解决C#中TimeOnly变量在switch语句中报错“A Constant value is expected”的问题
错误原因
C#的switch关系模式(比如>= X)要求比较的边界值必须是编译时常量,但TimeOnly.Parse()返回的是运行时计算的值,普通变量甚至static readonly字段也不属于编译时常量范畴,因此编译器会报错。
解决方案:使用switch的when子句做条件判断
通过when子句可以在case中加入自定义的运行时条件,完美适配TimeOnly的时间段比较需求,代码示例如下:
using System.Globalization; TimeOnly testTimeOnly = TimeOnly.ParseExact("00:00:00", "HH:mm:ss", CultureInfo.InvariantCulture); // 定义各时间段的边界 TimeOnly morningStart = TimeOnly.ParseExact("06:00:00", "HH:mm:ss", CultureInfo.InvariantCulture); TimeOnly afternoonStart = TimeOnly.ParseExact("12:00:00", "HH:mm:ss", CultureInfo.InvariantCulture); TimeOnly eveningStart = TimeOnly.ParseExact("18:00:00", "HH:mm:ss", CultureInfo.InvariantCulture); switch (testTimeOnly) { case var t when t >= TimeOnly.MinValue && t < morningStart: Console.WriteLine("现在是夜晚。"); break; case var t when t >= morningStart && t < afternoonStart: Console.WriteLine("现在是上午。"); break; case var t when t >= afternoonStart && t < eveningStart: Console.WriteLine("现在是下午。"); break; case var t when t >= eveningStart && t <= TimeOnly.MaxValue: Console.WriteLine("现在是晚上。"); break; default: Console.WriteLine("未知时间段!"); break; }
代码说明
var t是模式匹配中的变量模式,用来捕获当前的testTimeOnly值when后面跟的是运行时条件判断,可以自由使用变量或方法返回值作为边界- 用
TimeOnly.MinValue和TimeOnly.MaxValue代替手动解析的00:00和23:59,更简洁规范
替代方案:使用if-else语句
如果不需要拘泥于switch,用if-else也能更直观实现需求:
using System.Globalization; TimeOnly testTimeOnly = TimeOnly.ParseExact("00:00:00", "HH:mm:ss", CultureInfo.InvariantCulture); TimeOnly morningStart = TimeOnly.ParseExact("06:00:00", "HH:mm:ss", CultureInfo.InvariantCulture); TimeOnly afternoonStart = TimeOnly.ParseExact("12:00:00", "HH:mm:ss", CultureInfo.InvariantCulture); TimeOnly eveningStart = TimeOnly.ParseExact("18:00:00", "HH:mm:ss", CultureInfo.InvariantCulture); if (testTimeOnly >= TimeOnly.MinValue && testTimeOnly < morningStart) { Console.WriteLine("现在是夜晚。"); } else if (testTimeOnly >= morningStart && testTimeOnly < afternoonStart) { Console.WriteLine("现在是上午。"); } else if (testTimeOnly >= afternoonStart && testTimeOnly < eveningStart) { Console.WriteLine("现在是下午。"); } else if (testTimeOnly >= eveningStart && testTimeOnly <= TimeOnly.MaxValue) { Console.WriteLine("现在是晚上。"); } else { Console.WriteLine("未知时间段!"); }
内容的提问来源于stack exchange,提问作者Viky
相关产品推荐
相关产品推荐

