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

Nullable method-chaining with ?-Operator

我想我可以像这样使用 ?-运算符在可空类型上链接 methods/properties

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

为什么这如此重要,我如何才能实现顶部第一个示例中显示的行为?

测试后的主要问题:

我将您的确切代码复制到 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: Property access must assign to the property or use its value.

旧思想:

问题出在您的运算符 + 过载上。您返回了一个标准结构实例。这是不可为空的。因此,您不能使用 ? 运算符,因为它永远不会为空且不可为空。

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