将Vb.Net赋值给元组

5
VB是否支持给元组赋值? 如果支持,语法是什么?
Private Function GetPeStream(metadataDiagnostics As DiagnosticBag, peStreamProvider As EmitStreamProvider, metadataOnly As Boolean) As (peStream As Stream, signingStream As Stream, selectedStream As Stream)
    Return ...
End Function

Dim ret As Stream
Dim peStream as Stream
Dim signingInputStream as Stream
(peStream, signingInputStream, ret) = GetPeStream(metadataDiagnostics, peStreamProvider, metadataOnly)

你可以使用 "stream = GetPeStream(...)",然后在智能感知列表中会显示 stream.peStream、stream.signingStream 和 stream.selectedStream,而不是 stream.Item1、Item2 和 Item3。这并不是严格意义上的解构,但它可以起到同样的作用。 - Brain2000
4个回答

4

您可以使用以下语法来在单行中初始化和分配元组。

Dim x As Tuple(Of Stream, Stream, Stream)= New Tuple(of Stream,Stream,Stream)(str1,str2,str3)

重要提示:请确保在进行上述直接赋值之前,已经实例化并为str1str2str3分配了值。


2
您可以使用以下示例来避免使用Item1、Item2等。
Private Function GetPeStream(metadataDiagnostics As DiagnosticBag, peStreamProvider As EmitStreamProvider, metadataOnly As Boolean) As (peStream As Stream, signingStream As Stream, selectedStream As Stream)
    
    .....
    Return (processed_peStream, processed_signingStream,processed_selectedStream)
End Function


Private Function ConsumingGetPeStream()...

    'Calling the function
    Dim Your_Result_From_GetPeStream = GetPeStream(metadataDiagnostics_value, peStreamProvider_value, metadataOnly_Value)
    
    'Using returned values from function    
    Your_Result_From_GetPeStream.peStream
    Your_Result_From_GetPeStream.signingStream
    Your_Result_From_GetPeStream.selectedStream
    

End Function

为了更好地理解,这里提供了一个更简单的版本

      Public Sub Main()

                Dim ReturnFunctionWithTuple = FunctionWithTuple()

                Console.WriteLine($"Your long: {ReturnFunctionWithTuple.YourFieldLong}")
                Console.WriteLine($"Your date: {ReturnFunctionWithTuple.YourFieldDate}")
                Console.WriteLine($"Your bool: {ReturnFunctionWithTuple.YourFiedBoolean}")


            End Sub

            Public Function FunctionWithTuple() As (YourFieldLong As Long, YourFieldDate As Date, YourFiedBoolean As Boolean)

                Return (55, #01/01/2021#, False)

            End Function

这个语法对我们不起作用。我们不得不使用item1/Item2语法。Visual Studio接受了你的语法,但是当我们发布时,出现了语法错误。我真的很想使用你的语法。 - Be Kind To New Users
请检查您的语法,我正在添加一个简化版本。 - Fernando Angelieri

1

使用通用语法声明元组变量和函数返回类型,以使类型对齐。例如:

Public Sub GetTuple()
    Dim x As Tuple(Of String, String, Integer)
    x = GetData()
End Sub

Public Function GetData() As Tuple(Of String, String, Integer)

    Dim y = New Tuple(Of String, String, Integer)("A", "B", 27)
    Return y

End Function

我不想将返回的元组赋给另一个元组变量,我想将返回的元组分别赋给三个变量,在你的例子中是一个字符串、一个字符串和一个整数。我试图拆解返回的元组。在C#中,使用上述语法可以实现这一点。 - Paul Cohen
我从未见过在VB.net中访问元组成员而不显式引用成员。即使使用VB 2017的新功能,我也认为这是不可能的。https://blogs.msdn.microsoft.com/vbteam/2017/03/30/whats-new-in-visual-basic-2017/ - PKing

0
为了实现这一点,您需要创建一个新的元组,接受PKing所示的赋值,然后逐个手动复制每个变量。
Dim x As Tuple(Of Stream, Stream, Stream)
x = GetData()
Dim eStream  as Stream = x.Item1
Dim signingInputStream as Stream = x.Item2
Dim Ret as Stream = x.Item3

当然,这些任务将在循环中,并且有处理类型的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接