"default(TSource)" 是一个真正的方法吗?

4
MSDN关于Enumerable.FirstOrDefault方法的帮助页面上,有一个被解释为:

如果源为空,则为default(TSource);否则为源中的第一个元素。

备注部分包含如下内容:

引用类型和可空类型的默认值为null。

我总是检查null(VB.NET:Nothing)值,但是否有一些可以代替null/Nothing字面量的default(TSource)?(例如 default(int)

我找不到default(TSource) 方法,但它在帮助页面中被提到。或者不是一个方法吗?

编辑: default(TSource) 在C#和VB的MSDN页面中均可见,我想要覆盖两种语言的答案。


1
default - 不是一个函数或方法 - Grundy
3个回答

4
你可以使用文档 这里 中记录的 default 运算符。对于引用类型,它返回 null,对于值类型,它返回与类型相关的默认值。

3

default是获取Type默认值的关键字。 TSource是泛型类型参数,只是类型标记的占位符。

当使用IEnumerable<int>调用方法时,TSource将会是int;当使用IEnumerable<String>调用方法时,TSource将会是String,以此类推。因此,在这种情况下(使用int调用),default(TSource)就变成了default(int)

除非存在一个名为TSource的类型或存在一个名为TSource的泛型参数,否则就不存在像default(TSource)这样的东西。


好的。为了添加VB.NET等效性,我正在附加此链接 - miroxlav

2

我以前总是检查 null (VB.NET 中的 Nothing)

这种做法并不完全正确。 Nothing 不等同于 null;当使用 = 操作符将其赋值或与可空类型(引用类型或 Nullable<T>)进行比较时,Nothing 表示 null;当使用 Is Nothing 进行比较时,也表示 null。而当将其赋值或与非可空值类型进行比较时,Nothing 表示该类型的默认值。

因此在 VB 中:

Dim b as Boolean = 0 = Nothing ' b is True

“不是”和C#不一样:

bool b = 0 == null; // b is false

但更多的是:
bool b = 0 == default(int); // b is true

所以,在VB.NET中,default(T)的等价物确实是Nothing,当不使用Is进行比较时。

在VB.NET中,如果val不可空,则不允许使用val Is Nothing,而在C#中,您可以使用val == null,但会导致警告(且始终结果为false)。

在VB.NET中,您可以对可能为空的泛型类型执行val Is Nothing,C#也类似,使用val == null进行检查,此时检查是val是否为可空类型并且是否设置为空(通常情况下是无浪费的,对于非可空类型,JIT编译器知道val == null / val Is Nothing永远不会发生,因此会优化掉任何可能发生的操作)。

以下VB.NET和C#方法是等效的:

public static bool Demonstrate<T>(T x)
{
  T y = default(T);
  bool isNull = x == null;
  bool isDefault = x.Equals(default(T));
  int zero = default(int)
  return zero == default(int);
}

Public Shared Function Demonstrate(Of T)(x As T) As Boolean
  Dim y As T = Nothing
  Dim isNull As Boolean = x Is Nothing
  Dim isDefault As Boolean = x.Equals(Nothing)
  Dim zero As Integer = Nothing
  Return zero = Nothing
End Function

完美覆盖了“default()”问题,谢谢。将答案标记移至此处。 - miroxlav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接