返回一个可为null的泛型元素

本文关键字:null 泛型 元素 一个 返回 | 更新日期: 2023-09-27 18:00:27

我正在尝试制作一个方法,用可以是Nullable的泛型元素返回Array的最高值。

 public T Greatest<T>(T?[] array) where T : struct, IComparable<T> 
 {
     T? Greater = null;
     foreach (var elem in array)
     {
         if(elem.HasValue)
         {
             if(Greater.HasValue)
             {
                 if(Greater.Value.CompareTo(elem.Value) < 0)
                 {
                     Greater = elem;
                 }
             }
             else
             {
                 Greater = elem;
             }
        }
    }
    //Problem here: What is the best way to return the greatest value?
    // ****
    return Greater.Value; // Possible InvalidOperationException 
    // ****
}

返回值的正确方式是什么?

返回一个可为null的泛型元素

Nullable.GetValueOrDefault

您可以简化您的方法:

public T Greatest<T>(T?[] array) where T : struct, IComparable<T> 
{
    return array.Max().GetValueOrDefault();
}

您可以简单地更改方法以返回T?,然后返回Greater。如果最大的价值根本不是价值,为什么要假装它是价值呢?另一方面,如果真的需要返回某种不可为null的值,那么可以执行

if (Greater.HasValue)
    return Greater.Value;
else 
    return /* define your default here */

但是,定义一个适用于所有类型T的默认值会很困难,因此您也可以依赖该类型的自动默认值。

return Greater.GetValueOrDefault(); // returns either Value or default(T)

哪个是的功能等价物

if (Greater.HasValue)
    return Greater.Value;
else 
    return default(T);

要编译方法,可以提取默认值。

return (Greater.HasValue) ?
            Greater.Value :
            default(T);

也就是说,如果您使用的是现代版本的C#,那么首先不应该编写此方法,而应该使用Enumerable.Max().

OP表示

返回Value的正确方法是什么?

正确的方法是不要重新发明轮子:

public T Greatest<T>( IEnumerable<T?> list ) where T : struct, IComparable<T> 
{
    return list.Where(  x => x.HasValue )
               .Select( x => x.Value    )
               .Max()
               ;
}