可空的方法 - 用?-Operator链接

时间:2017-02-28 23:10:49

标签: vb.net nullable method-chaining

我以为我可以使用像这样的?-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

为什么这样,更重要的是如何实现我在第一个例子中显示的行为?

1 个答案:

答案 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目前也永远不会为空。