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

使用C# record struct和INumber<T>实现正数类型时遇编译错误

解决INumber泛型类型与0比较的编译错误

你遇到的问题核心是不能直接将泛型类型T和int类型的0进行比较,哪怕已经约束T实现INumber<T>也不行——因为INumber<T>覆盖的数值类型(比如decimal、long、float等)无法和int的0直接进行运算符重载匹配。

正确的做法是使用INumber<T>接口提供的静态成员Zero,它会返回对应T类型的零值,这样就能和Value进行类型匹配的比较了。修正后的代码如下:

public record struct PositiveNumber<T>(T Value) where T : INumber<T>
{
    public T Value { get; init; } = Value >= INumber<T>.Zero ? Value : throw new ArgumentOutOfRangeException(nameof(Value));
}

补充两点注意事项:

  • 如果要支持无符号类型(比如uint、ulong),其实不需要这个判断,但代码依然兼容,因为无符号类型的Value本身不可能小于Zero
  • 对于浮点数类型(比如float、double),这个判断会保留零值,如果你需要严格正数(排除零),可以把>=改成>

内容的提问来源于stack exchange,提问作者dzenesiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:37:02