与a = b = 5 in VB.NET - impossible?不同, 我特别要求一种扩展方法来克服这个问题。
在C#中,您可以执行以下操作,这非常有用:
a = b = c = 16;
所有变量最终都是16。 Why do assignment statements return a value?中的答案之一说明了为什么这很方便。
但是在VB.Net中,如果你这样做:
Dim a, b, c As Integer
a = b = c = 16
你得到的所有内容都是0,b和c。
我想通过扩展方法来打败这个限制。可以这样做吗?
编辑:
这是我个人可以提出的最接近的答案:
<System.Runtime.CompilerServices.Extension()>
Public Function Assign(ByRef Operand1 As Object, ByRef Operand2 As Object) As Object
Operand1 = Operand2
Return Operand1
End Function
即使它允许你这样做,
Dim a, b, c As Integer
a.Assign(b.Assign(c.Assign(16)))
它确实很笨拙,而且更难以遵循,但它最能直接回答我能找到的实际问题。我欢迎任何改进。
答案 0 :(得分:0)
正如a = b = 5 in VB.NET = impossible?中提到的γnράσκωδ'αείπολλάδιδασκόμε,VB使用相同的运算符进行赋值和相等,并且你不能根据Tim的注释创建扩展运算符,所以唯一的方法是通过扩展方法就像你找到的一样。
如果重载它以接受多个参数,扩展方法的语法可以更清晰;我猜这3个任务就足够了。这里是为Integer类型编写的,所以你不必费心去做,但如果你愿意,可以使用Object。
<System.Runtime.CompilerServices.Extension> _
Public Sub Assign(ByRef aInt As Integer, ByRef newInt As Integer)
newInt = aInt
End Sub
<System.Runtime.CompilerServices.Extension> _
Public Sub Assign(ByRef aInt As Integer, ByRef newInt1 As Integer, ByRef newInt2 As Integer)
newInt1 = aInt
newInt2 = aInt
End Sub
<System.Runtime.CompilerServices.Extension> _
Public Sub Assign(ByRef aInt As Integer, ByRef newInt1 As Integer, ByRef newInt2 As Integer, ByRef newInt3 As Integer)
newInt1 = aInt
newInt2 = aInt
newInt3 = aInt
End Sub
用法:
Dim a, b, c, d As Integer
a = 16
a.Assign(b)
a.Assign(c, d)
Console.Write("b = {0}; c = {1}; d = {2}", New Object() {b, c, d})
a = 99
a.Assign(b, c, d)
Console.Write("b = {0}; c = {1}; d = {2}", New Object() {b, c, d})
如果你愿意,你可以继续添加更多的重载,包括一个带有数组或列表的重载,如果你想要N个赋值。