gpt4 book ai didi

c# - 为什么引用和值类型的集合之间的 Enumerable Min 或 Max 不一致?

转载 作者:太空狗 更新时间:2023-10-29 22:36:48 28 4
gpt4 key购买 nike

在处理 序列时,我惊讶地发现 min 的行为或 max根据源集合元素是否属于 value type 而不同或 reference type :

var refCollection = new object[0];
var valCollection = new int[0];
var nullableCollection = new int?[0];

var refMin = refCollection.Min(x => x); // null
var valMin = valCollection.Min(); // InvalidOperationException
var nullableMin = nullableCollection.Min(); // null

.NET Core implementation of Enumerable extensions 上可以很好地看到这种行为差异.

然而,当查看 Jon Skeet's MinBy extension 时情况并非如此,例如,在任何一种情况下都会抛出,正如我所期望的那样。

难道行为上的差异不会造成混淆吗?为引用类型的集合返回 null 有什么好处吗?

最佳答案

值得注意的是,当涉及到 Min 时,可空类型(可空值类型和引用类型)的行为通常不同于不可空值类型:a null 值一般被视为“缺失”,所以“仅缺失值的最小值”的结果为“缺失值”不无道理。

例如:

int?[] nullableInts = new int?[5]; // All values null
int? min = nullableInts.Min(); // No exception, min is null
nullableInts[3] = 2;
min = nullableInts.Min(); // No exception, min is 2

对于不可为 null 的值类型,确实没有指示“缺失值”的选项(除非返回类型更改为始终为 nullable 类型),因此异常......但这相当容易无论如何要发现,对于不可空值类型,唯一没有最小值的情况是源为空。

(MinBy 可能实际上应该以相同的方式运行:)

这也和LINQ to XML中的转换一致:

XElement element = null;
int? x = (int?) element; // null
int y = (int) element; // Bang

基本上,它确实有一定的道理 - 没有一个选项可以与所有内容保持一致。

关于c# - 为什么引用和值类型的集合之间的 Enumerable Min 或 Max 不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31154798/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com