使用 ?-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
目前也永远不会为空。
我想我可以像这样使用 ?-运算符在可空类型上链接 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
目前也永远不会为空。