我遇到了这个,并想知道是否有人可以解释为什么这在VB.NET中工作,我希望它会失败,就像在C#中一样
//The C# Version
struct Person {
public string name;
}
...
Person someone = null; //Nope! Can't do that!!
Person? someoneElse = null; //No problem, just like expected
Run Code Online (Sandbox Code Playgroud)
但是在VB.NET中...
Structure Person
Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?
Run Code Online (Sandbox Code Playgroud)
没有什么不同于null(Nothing!= null - LOL?),或者这只是处理两种语言之间相同情况的不同方式?
为什么或两者之间的处理方式不同,这使得一个可以在一个,而不是另一个?
[更新]
鉴于一些评论,我更多地搞砸了......如果你想在VB.NET中允许某些东西为null,那么好像你真的必须使用Nullable ...例如...
'This is false - It is still a person'
Dim someone As Person = Nothing
Dim isSomeoneNull As Boolean = someone.Equals(Nothing) …Run Code Online (Sandbox Code Playgroud) 我知道一些差异,
我错过了还有其他的区别......如果是的话,他们是什么?
我在使用结构和函数时遇到了一些麻烦,这些函数在VB.NET中返回Nothing.
让我试着用这段代码解释一下:
Public Class Form1
Structure Test
Dim field1 As String
End Structure
Private Function Foo() As Test
Return Nothing
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim st As Test = Foo()
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
在前面的代码中,当我返回Nothing作为Foo函数的结果时,我希望st是Nothing.但这不是发生的事情.
然后我在MSDN文档中找到:
为变量赋值Nothing将其设置为其声明类型的默认值.如果该类型包含变量成员,则它们都设置为其默认值.
所以我发现当我为结构分配Nothing时,它的所有成员都被设置为默认值,而不是结构本身.
另外,我试图通过声明:使st成为Nullable类型:
Dim st As Nullable(Of Test) = Foo()
Run Code Online (Sandbox Code Playgroud)
但是,我仍然无法使用以下方法检查st是否为Nothing:
If st Is Nothing Then
Run Code Online (Sandbox Code Playgroud)
要么
If st.Equals(Nothing) Then
Run Code Online (Sandbox Code Playgroud)
那么,问题:
1 - 是否可以为结构而不是其成员分配 …