在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页面上都可见,我对这两种语言的答案感兴趣。
答案 0 :(得分:3)
您可以使用default
运算符,该运算符记录为here。它为引用类型返回null
,为值类型返回类型相关的默认值。
答案 1 :(得分:3)
default是用于获取默认值Type
的关键字。 TSource
是泛型类型参数。它只是类型令牌的占位符。
当使用IEnumerable<int>
调用方法时,TSource
将为int
,TSource
在String
调用后将为IEnumerable<String>
,因此上。鉴于default(TSource)
在这种情况下变为default(int)
(使用int
调用)。
除default(TSource)
类型或存在名称为TSource
的通用参数外,没有类似TSource
的内容。
答案 2 :(得分:2)
我一直在检查null(VB.NET:Nothing)
这不太正确。 Nothing
与null
不同; 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