听起来很简单,但它不起作用。在此示例中,我想将 3 个字段的值设置为第 4 个。我可以做这样的事情......
Dim str1 As String = "1"
Dim str2 As String = "2"
Dim str3 As String = "3"
Dim str4 As String = "4"
str2 = str1
str3 = str1
str4 = str1
...但这有点罗嗦(是的,我知道,vb 在大多数情况下都是罗嗦的)。我想有一些东西可以用来减少单行调用,所以我做了这个扩展方法。
Module Module1
Sub Main()
Dim str1 As String = "1"
Dim str2 As String = "2"
Dim str3 As String = "3"
Dim str4 As String = "4"
Console.WriteLine("Extension method return value = {0}", str1.SetEqual(str2, str3, str4))
Console.WriteLine("String 1 = {0}", str1)
Console.WriteLine("String 2 = {0}", str2)
Console.WriteLine("String 3 = {0}", str3)
Console.WriteLine("String 4 = {0}", str4)
Console.ReadKey()
End Sub
<System.Runtime.CompilerServices.Extension()> _
Public Function SetEqual(Of T)(ByVal source As T, _
ByVal ParamArray targets() As T) _
As T
For _index = 0 To targets.Length - 1
targets(_index) = source
Console.WriteLine("Target Value {0} = {1}", _index, targets(_index))
Next
Return source
End Function
End Module
看起来很简单,对吧?嗯,输出是这样的……
Target Value 0 = 1
Target Value 1 = 1
Target Value 2 = 1
Extension method return value = 1
String 1 = 1
String 2 = 2
String 3 = 3
String 4 = 4
参数数组中的值没有在返回中更新!我期待现在所有的最终值都是“1”,就像它们在函数中一样。
有没有办法获得这样的可更新 ParamArray 集合?ParamArray 必须声明为 ByVal,但使用像 String 这样的引用类型,难道不应该只复制指针并允许我更改基础值吗?
有没有更好的方法来得到我想要的?(C# 不是这个选项)。