2009-08-11 50 views
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 
+0

你在做什么需要一个结构?对于大多数.net程序,尤其是对于学习.NET的程序,我看不到太多的用途.net – Maslow 2009-08-11 15:45:23

+0

你在做什么不能用Dim myNullVar作为'Integer?'包裹在课堂上?或者如果这是所有该结构包含的值,则将其作为您传递的值。 – Maslow 2009-08-11 17:00:16

回答

3

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

这实际上是一件好事 - 值类型应该是不可变的。可变的结构是可怕的 - 如果事实上,使得难以使用你的类型推动你的不变性路线,这很好。

使您的字段为只读,并添加一个构造函数让您传递值。然后,而不是试图修改可空值,分配一个全新的值给变量。

+0

啊奇怪的结构问题,我不喜欢结构的另一个原因。 – Maslow 2009-08-11 16:56:35

+1

虽然我很少自己写结构,但问题实际上是在这里使用* mutable *结构。 – 2009-08-11 17:16:40

+0

我以前有可变的结构咬我,而且因为我不知道发生了什么事情......我将单词结构转换为类。突然之间我所有的代码都起作用了。所以我放弃了尝试的结构。 – Maslow 2009-08-11 21:18:26

-1

当类型是可空的你应该被检查,看它是否具有值,则访问该值仅当有一个:

if(myNullableInstance.hasValue) 
myNullableInstance.value.myNullVar=1 
+0

当我尝试时出现此错误:“表达式是一个值,因此不能作为赋值的目标。” – Pliskin 2009-08-11 15:55:06

+0

是的,看起来我的结构知识几乎不存在,因为切换到对象方向。回应我的问题评论的基地职位? – Maslow 2009-08-11 17:01:17

+0

爱讽刺。 – Pliskin 2009-08-11 20:44:44

0

由于Nullable<T>结构通过Value属性公开基础值。因此,你需要:

myNullableInstance.Value.myNullVar = 1 
+0

当我尝试时出现此错误:“表达式是一个值,因此不能作为赋值的目标。” – Pliskin 2009-08-11 15:52:10

1

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

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

这工作虽然:

Dim myInstance as myNullable 
myInstance.myNullVar = 1 
myNullableInstance = myInstance 
0

这是有道理的,这确实工作:

myNullableInstance.Value.myNullVar = 1 

基本上,你会被分配给结构的一些副本被退回Value属性。

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

0

可为空的结构是一种痛苦,微软必须让事情变得如此困难没有理由。它通过这种方式使编译器编写者而不是语言用户更容易。

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

如果我们回到逻辑类型指针,我们都会更好。那么我们就不需要像不可变的花式词语。 (不可改变的意思是不可改变的!)

我的建议是将Nullable结构沟槽并使其成为一个总是可以为空的类。