我正在尝试使用
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# 不支持直接对受限于接口的泛型类型参数使用比较运算符。
你需要一些额外的约束,但我很懒,所以我发现辅助方法更容易:
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; }
}
希望这有帮助。