You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:12:42