实际上什么都没有 - 如何转换

时间:2016-06-22 03:21:24

标签: c# vb.net null nothing

我有一个带有测试方法的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

1 个答案:

答案 0 :(得分:2)

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

这里在我的VB代码中,方法的返回值是Integer(值类型)所以没有什么是它的默认值0。这就是为什么0也被分配给动态类型的原因。但它不是null的替代品,也不等同于null