作为惯例,
假设你有一个内存中的
当然,这适用于扩展方法重载
但是,该方法从不返回
这是从文档中明显的,也可以从System.Core.dll源代码中看出:
请注意,只有一个
总是包装返回值似乎是浪费的。(如果需要,调用者可以在他的一侧隐式执行包装。)
此外,这种返回类型可能会导致调用者编写诸如
int?
表示 System.Nullable<int>
(或 System.Nullable`1[System.Int32]
)。假设你有一个内存中的
IEnumerable<int?>
(比如说一个 List<int?>
),我们称之为 seq
;那么你可以使用以下代码找到它的总和:var seqSum = seq.Sum();
当然,这适用于扩展方法重载
int? IEnumerable<int?>.Sum()
(文档),实际上是System.Linq.Enumerable
上的静态方法。但是,该方法从不返回
null
,那么为什么返回类型声明为Nullable<>
? 即使在seq
为空集合或更一般地说是所有元素都是类型int?
的null
值的集合的情况下,所讨论的Sum
方法仍然返回零,而不是null
。这是从文档中明显的,也可以从System.Core.dll源代码中看出:
public static int? Sum(this IEnumerable<int?> source) {
if (source == null) throw Error.ArgumentNull("source");
int sum = 0;
checked {
foreach (int? v in source) {
if (v != null) sum += v.GetValueOrDefault();
}
}
return sum;
}
请注意,只有一个
return
语句,它的表达式sum
的类型为int
(然后将通过包装隐式转换为int?
)。总是包装返回值似乎是浪费的。(如果需要,调用者可以在他的一侧隐式执行包装。)
此外,这种返回类型可能会导致调用者编写诸如
if (!seqSum.HasValue) { /* logic to handle this */ }
的代码,但实际上是无法到达的(C#编译器无法知道这个事实)。
那么为什么不将此返回参数简单地声明为没有可空性的int
呢?
我想知道是否有与int? IQueryable<int?>.Sum()
(在System.Linq.Queryable
类中)具有相同返回类型的好处。如果有实现它的LINQ提供程序(可能是LINQ to SQL?),则后者方法在实践中可能返回null
。
null
后为什么要使用GetValueOrDefault
? - juharrGetValueOrDefault
比Value
更高效,它不需要检查是否有值,只需返回字段value
。 - Tim SchmelterNullable<T>
上使用==null
/!=null
只是语言技巧;它编译成.HasValue
测试。 - Marc Gravell