我以为我可以使用像这样的?-Operator链接Nullable Types上的方法/属性
Dim foo As SomeObject? = New SomeObject()
Dim bar As SomeObject? = Nothing
foo?.SomeProperty 'Returns a value
bar?.someProperty 'Returns Nothing
但是,给出以下特殊例子
Structure Foo
Public Sub New(bar As Integer)
Me.Bar = bar
End Sub
Property Bar() As Integer
Public Shared Operator +(f1 As Foo, f2 As Foo) As Foo
Return New Foo(f1.Bar + f2.Bar)
End Operator
End Structure
执行以下操作后出现错误
Dim baz1 As Foo? = New Foo(13)
Dim baz2 As Foo? = New Foo(37)
Dim baz3 = baz1 + baz2
baz3?.Bar 'error BC36637: The '?' character cannot be used here
为什么这样,更重要的是如何实现我在第一个例子中显示的行为?
答案 0 :(得分:0)
测试后的主要问题:
我将您的确切代码复制到VS2015并进行了测试。问题是因为你试图调用一个属性,但是没有对它做任何事情。
你不能只是打电话给一个房产。您需要写入或读取它。以下工作正常。
Dim baz1 As Foo? = New Foo(13)
Dim baz2 As Foo? = New Foo(37)
Dim baz3 = baz1 + baz2
Dim fooBar = baz3?.Bar
如果我实际添加了一个方法,它也会起作用:
Dim baz1 As Foo? = New Foo(13)
Dim baz2 As Foo? = New Foo(37)
Dim baz3 = baz1 + baz2
baz3?.FooBar()
我在代码中遇到的实际错误是:
BC30545:属性访问必须分配给属性或使用其值。
旧思想:
问题在于您的运营商+
超载。您返回了一个标准的struct实例。这不是可空的。因此,您不能使用?
运算符,因为它永远不会为null且不可为空。
Public Shared Operator +(f1 As Foo, f2 As Foo) As Foo
Return New Foo(f1.Bar + f2.Bar)
End Operator
您可以通过将声明更改为:
来使其工作(未经测试)Dim baz3 As Foo? = baz1 + baz2
但即便如此,这可能也行不通,因为baz1+baz2
目前也永远不会为空。