在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
答案 0 :(得分:3)
正如其他人所说,您需要使用Value
属性来获取该值。但是,System.Nullable<T>
是不可变的 - Value
属性是只读的。它将返回值的副本,因此即使您可以更改字段,也不会执行您想要的操作。
这实际上是一件好事 - 值类型应该是不可变的。可变结构是可怕的 - 如果Nullable<T>
使你难以使用你的类型的事实会推动你进入不变性路线,那就太好了。
将字段设为只读,并添加构造函数以传递值。然后,不是尝试修改可空值,而是为变量赋予一个全新的值。
答案 1 :(得分:1)
正如其他答案所述,您可以使用.Value访问可空的内部值。但他们建议你做myNullableInstance.Value.myNullVar = 1哪个不行。
那是因为结构的运作方式。更改结构的成员时,将创建新的结构实例。在这种情况下你不能这样做,因为它会修改Nullable类的Value属性,这不能直接完成,因为Value是ReadOnly。
这会有效:
Dim myInstance as myNullable
myInstance.myNullVar = 1
myNullableInstance = myInstance
答案 2 :(得分:0)
因为Nullable<T>
结构通过Value
属性公开了基础值。因此,您需要:
myNullableInstance.Value.myNullVar = 1
答案 3 :(得分:0)
这有效不工作:
myNullableInstance.Value.myNullVar = 1
基本上,您将分配Value属性返回的结构的某些副本。
这不是一个真正的问题,因为通常将结构作为 immutable 作为最佳实践。您可以来回处理一些分配,但正如其他人发布的那样,您应该重新考虑使用类。这样,你也不需要任何Nullable,因为你可以使用null引用。
答案 4 :(得分:0)
Nullable结构是一种痛苦,没有充分的理由让微软必须让事情变得如此困难。它以这种方式完成,使编译器编写者更容易,而不是语言用户。
实际上,我们需要使引用类型和值类型的行为不同,这是没有充分理由的。微软试图隐藏逻辑指针(地址),但它不能很好地工作,因为它使事情变得更加困难和不容易。对语言施加的每个规则和限制都会使事情变得更加困难,从而导致效率低下,运行时错误和更高的开发成本。
如果我们回到逻辑类型指针,我们会更好。那么我们就不需要像不变的那样花哨的词。 (不可改变意味着不可改变!)
我的建议是抛弃Nullable结构,使其成为一个永远可以为空的类。
答案 5 :(得分:-1)
当一个类型可以为空时,你应该检查它是否有值,然后只有在有一个值时访问该值:
if(myNullableInstance.hasValue)
myNullableInstance.value.myNullVar=1