无法看到声明为可为空的结构的成员

时间:2009-08-11 15:41:59

标签: vb.net nullable structure

在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

6 个答案:

答案 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