C# 中的通用 PostitiveNumber 结构

问题描述 投票:0回答:1

我正在尝试使用

record struct
INumber<T>
界面创建一个仅正数的概念。我希望这能起作用:

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

这会导致

Value >= 0
出现编译错误

运算符 >= 不能应用于“T”和“int”类型的操作数。

我认为将泛型限制为

INumber<T>
可以解决这个问题。这是不可能的,还是我在这里做错了什么?

c# generics numbers .net-8.0
1个回答
0
投票

不幸的是,C# 不支持直接对受限于接口的泛型类型参数使用比较运算符。

你需要一些额外的约束,但我很懒,所以我发现辅助方法更容易:

using System;
using System.Numerics;
                    
public class Program
{
    public static void Main()
    {
        var positiveInt = new PositiveNumber<int>(5);
        var positiveDbl = new PositiveNumber<double>(3.14);
        
        var invalidNumber = new PositiveNumber<int>(-549); // Throws ArgumentOutOfRangeException
    }
}

public record struct PositiveNumber<T> where T : INumber<T>
{
    public PositiveNumber(T value)
    {
        Value = value >= default(T) ? value : throw new ArgumentOutOfRangeException(nameof(value));
    }

    public T Value { get; init; }
}

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.