3

在 VB.NET 中,为什么当我将结构的成员设置为可为空的类型时,我看不到它的成员?

例子:

Public Structure myNullable  
    Dim myNullVar As Integer  
End Structure

Sub Main()  
    Dim myInstance As myNullable 'This works.  
    Dim myNullableInstance? As myNullable 'This works.   
    myInstance.myNullVar = 1  'This works.     
    myNullableInstance.myNullVar = 1   'This doesn't work.  
End Sub
4

5 回答 5

3

正如其他人所说,您需要使用该Value属性来获取值。但是,System.Nullable<T>它是不可变的 - 该Value属性是只读的。它将返回该值的副本,因此即使您可以更改该字段,它也不会执行您想要的操作。

这实际上是一件好事——值类型应该是不可变的。可变结构是可怕的——如果难以使用您的类型的事实Nullable<T>将您推向不变性路线,那就太好了。

将您的字段设为只读,并添加一个构造函数以让您传入值。然后,不要尝试修改可为空的值,而是为变量分配一个全新的值。

于 2009-08-11T16:06:20.623 回答
1

正如其他答案所指出的,您可以使用 .Value 访问可为空的内部值。但他们建议你做 myNullableInstance.Value.myNullVar = 1 这不起作用。

这是因为结构的工作方式。当您更改结构的成员时,会创建一个新的结构实例。在这种情况下你不能这样做,因为它会修改 Nullable 类的 Value 属性,这不能直接完成,因为 Value 是只读的。

不过,这会起作用:

Dim myInstance as myNullable
myInstance.myNullVar = 1
myNullableInstance = myInstance
于 2009-08-11T16:13:38.253 回答
0

因为结构通过属性Nullable<T>暴露了基础值。Value因此,您需要:

myNullableInstance.Value.myNullVar = 1
于 2009-08-11T15:44:51.680 回答
0

这是有道理的,这不起作用

myNullableInstance.Value.myNullVar = 1

基本上,您将分配给由 Value 属性返回的结构的某些副本。

这不是一个真正的问题,因为通常将结构制成不可变作为最佳实践。您可以通过一些来回的作业来解决这个问题,但是正如其他人发布的那样,您应该重新考虑使用课程。这样,您也不需要任何 Nullable,因为您可以只使用 null 引用。

于 2009-08-11T16:16:16.517 回答
0

可空结构是一种痛苦,微软没有充分的理由让事情变得如此困难。这样做是为了让编译器作者而不是语言用户更容易。

事实上,我们需要让引用类型和值类型表现不同,这并不是很好的理由。微软正试图隐藏逻辑指针(地址),但它不能很好地工作,因为它使事情变得更困难而不是更容易。对语言施加的每条规则和限制都会使事情变得更加困难,并导致效率低下、运行时错误和更高的开发成本。

如果我们回到逻辑类型指针,我们都会变得更好。那么我们就不需要像不可变这样的花哨的词了。(不可变意味着不变!)

我的建议是放弃 Nullable 结构并使其成为始终可以为空的类。

于 2013-04-30T18:20:30.647 回答