【问题标题】:Is default(TSource) a real method?default(TSource) 是一个真正的方法吗?
【发布时间】:2014-12-17 12:25:05
【问题描述】:

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

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

备注部分包含注释:

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

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

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

编辑:default(TSource) 在 C# 和 VB 的 MSDN 页面上可见,我有兴趣回答涵盖这两种语言。

【问题讨论】:

标签: c# .net vb.net linq


【解决方案1】:

您可以使用default 运算符,该运算符记录在here 中。它为引用类型返回null,为值类型返回一个依赖于类型的默认值。

【讨论】:

    【解决方案2】:

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

    当使用IEnumerable<int> 调用该方法时,TSource 将是intTSource 在使用IEnumerable<String> 调用时将是String 等等。鉴于在这种情况下 default(TSource) 变为 default(int)(使用 int 调用)。

    没有像default(TSource) 这样的东西,除非存在类型TSource 或存在名称为TSource 的泛型参数。

    【讨论】:

    • 好的。要添加 VB.NET 等效项,我将附加 this link
    【解决方案3】:

    我一直在检查 null(VB.NET:什么都没有)

    这不太正确。 Nothingnull不一样; Nothing 表示null,当分配或与= 与可空类型(引用类型或Nullable<T>)比较或使用Is 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
    

    因此,当不使用Is 进行比较时,default(T) 的 VB.NET 等价物确实是 Nothing

    在 VB.NET 中,您不能使用 val Is Nothing,而 val 不可为空,而在 C# 中,您可以使用 val == null,但它会导致警告(并且总是导致 false)。

    在 VB.NET 中,您可以使用 可能可为空的泛型类型来执行 val Is Nothing,同样使用 C# 和 val == null,在这种情况下,检查是 val是一个可以为空的类型,它被设置为空(并且是一个无浪费的类型,通常在不可为空的类型的情况下,抖动优化了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()问题,谢谢。把答案移到这里。
    猜你喜欢
    • 2023-03-19
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2013-12-21
    相关资源
    最近更新 更多