我有一个带有测试方法的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
。
答案 0 :(得分:2)
正如我在问题中所提到的(我也假设),Nothing
表示任何数据类型的默认值(C#default(T)
)。对于引用类型,默认值为空引用。对于值类型,默认值取决于值类型是否可为空。
这里在我的VB代码中,方法的返回值是Integer(值类型)所以没有什么是它的默认值0
。这就是为什么0
也被分配给动态类型的原因。但它不是null
的替代品,也不等同于null
。