默认(TSource)是一种真正的方法吗?

时间:2014-12-17 12:25:05

标签: c# .net vb.net linq

MSDN help page on Enumerable.FirstOrDefault Method中,方法结果解释为:

  

默认(TSource),如果source为空;否则,第一个元素   源。

备注部分包含注释:

  

reference和nullable类型的默认值为null。

我一直在检查null(VB.NET:Nothing)值,但有一些default(TSource)可以用来代替null/Nothing字面值吗? (例如default(int)。)

我找不到default(TSource)方法,但在帮助页面上提到了它。或者这不是一种方法?

编辑: default(TSource)在CDN和VB的MSDN页面上都可见,我对这两种语言的答案感兴趣。

3 个答案:

答案 0 :(得分:3)

您可以使用default运算符,该运算符记录为here。它为引用类型返回null,为值类型返回类型相关的默认值。

答案 1 :(得分:3)

default是用于获取默认值Type的关键字。 TSource是泛型类型参数。它只是类型令牌的占位符。

当使用IEnumerable<int>调用方法时,TSource将为intTSourceString调用后将为IEnumerable<String>,因此上。鉴于default(TSource)在这种情况下变为default(int)(使用int调用)。

default(TSource)类型或存在名称为TSource的通用参数外,没有类似TSource的内容。

答案 2 :(得分:2)

  

我一直在检查null(VB.NET:Nothing)

这不太正确。 Nothingnull不同; Nothing表示null在使用Nullable<T>或使用=进行比较或与可空类型(引用类型或Is Nothing)进行比较或比较时,表示=,表示默认值与Dim b as Boolean = 0 = Nothing ' b is True 分配或比较的非可空值类型。

因此VB:

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

与C#相同:

bool b = 0 == default(int); // b is true

而不是:

default(T)

因此,当使用Nothing进行比较时,Is的VB.NET等效值确实为val Is Nothing

在VB.NET中,val不允许val == null不可为空,而在C#中你可以执行false但它会引发警告(并且总是导致{ {1}})。

在VB.NET中,您可以使用可以可以为空的泛型类型val Is Nothing,同样使用C#和val == null,在这种情况下,检查是val是一个可以为空的类型,它被设置为null(并且在那里是无浪费的,通常在非可空类型的情况下,抖动优化掉任何如果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