【问题标题】:Actually what is Nothing - How it is converted实际上什么是无 - 它是如何转换的
【发布时间】:2016-06-22 03:21:24
【问题描述】:

我有一个带有测试方法的 VB 类库。这将返回一个整数(有时会返回 Nothing)。

Public Class Class1
    Public Function testMethod() As Integer
        'Some code here
        Return Nothing
    End Function
End Class 

如果我在 VB 项目中调用该方法,则一切正常。例如:

  Dim output As String = testMethod().ToString() ' Works fine and output =""

但是当我在 C# 应用程序中通过创建对象来调用该方法时,当返回值为Nothing 时,它会抛出 null 错误。

VBTestLib.Class1 classObject = new VBTestLib.Class1();
string objectStringValue = classObject.testMethod().ToString(); // Error

这意味着Nothing 将转换为null(不允许null.ToString())。现在考虑下一个例子:

 int objectIntValue = classObject.testMethod(); // objectIntValue = 0

这里 Nothing 将被转换为 int 的默认值 (0)。我已经使用dynamic 扩展了测试,那么分配的值​​也是0。即,

 dynamic objectDynamicValue = classObject.testMethod();// objectDynamicValue = 0

所以我的问题是,Nothing 是什么?分配给 C# 类型时如何转换?或者我应该得出结论:

如果 VB 方法返回 Nothing 并将值分配给值类型的 C# 变量,则将分配方法返回类型的默认值。如果将其分配给引用类型变量,则将分配null

【问题讨论】:

  • 您回答了自己的问题...
  • 您的示例有问题 - testMethod().ToString() 在 VB 中为“0”,而不是空字符串。
  • 无论是从VB还是C#调用VB方法,你的结论都是正确的。
  • 值类型(本质上是基元和结构)不能是Nothing,因此它们被设置为该类型的默认值。引用类型实际上可以是Nothing

标签: c# vb.net null nothing


【解决方案1】:

正如我在问题中提到的(我也假设过),Nothing 表示任何数据类型的默认值(C#default(T))。对于引用类型,默认值为空引用。对于值类型,默认值取决于值类型是否可以为空。

在我的 VB 代码中,该方法的返回值为 Integer(值类型),因此默认值 0 不会是任何值。这就是为什么0 也被分配给动态类型的原因。但它不是null 的替代品,或者它不等同于null

【讨论】:

    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2012-01-08
    • 2011-08-06
    • 2014-11-22
    • 1970-01-01
    • 2021-05-12
    相关资源
    最近更新 更多