返回一个可为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
// ****
}
返回值的正确方式是什么?
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()
;
}