【问题标题】:Min of two numeric types (including nullable)两种数字类型的最小值(包括可为空的)
【发布时间】:2023-01-27 23:21:30
【问题描述】:

我想要一个返回两个值中最小值的方法,当一个值为空时它应该返回非空值,当两个都为空时它应该返回空值。

我用下面的方法创建了一个辅助类public static T? Min<T>(T? a, T? b)

我试图通过添加约束 where T : IEquatable<T>, IComparable<T> 来使其非常灵活(也支持字符串等),但是这些不允许我传递 int 参数。

然后我尝试了where T : INumber<T>。这适用于 int 参数,但不适用于 Nullable<int>,因为该类型不满足约束 INumber<Nullable<int>>

有没有办法做到这一点?

【问题讨论】:

  • public static T? Min<T>(T? a, T? b) where T : struct, INumber<T>

标签: c# generics


【解决方案1】:

这对你有用吗?

public static T? MinOf<T>(T? a, T? b) where T: IComparable<T>
{
    if (a is null)
        return b;

    if (b is null) 
        return a;

    return a.CompareTo(b) < 0 ? a : b;
}

【讨论】:

    【解决方案2】:

    您需要添加 struct 约束:

    public static T? Min<T>(T? a, T? b) where T : struct, IEquatable<T>, IComparable<T> 
    { 
        // do your magic here
    }
    

    这对 int 和 int 都能成功编译?参数(fiddle):

    int a = 2;
    int? b = 2;
        
    int? c = Min<int>(a, a);
    int? d = Min(b, b);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2014-01-25
      相关资源
      最近更新 更多