使用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
相关产品推荐
相关产品推荐

