十分に単純に聞こえますが、機能していません。この例では、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 は冗長です)。これを1行の呼び出しに減らすために使用できるものが欲しいので、この拡張メソッドを作成しました。
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
param 配列の値が戻り時に更新されませんでした! 関数のように、すべての最終値が「1」になることを期待していました。
このような更新可能な ParamArray コレクションを取得する方法はありますか? ParamArray は ByVal として宣言する必要がありますが、String のような参照型では、ポインターのコピーを作成するだけで、基になる値を変更できるのではないでしょうか?
私が欲しいものを手に入れるためのより良い方法はありますか?(C# はこのオプションではありません)。