튜플(Visual Basic)Tuples (Visual Basic)

Visual Basic 2017부터 Visual Basic 언어는 튜플을 만들고 튜플 요소에 더 쉽게 액세스할 수 있도록 하는 튜플에 대 한 기본 제공 지원을 제공 합니다.Starting with Visual Basic 2017, the Visual Basic language offers built-in support for tuples that makes creating tuples and accessing the elements of tuples easier. 튜플은 값의 특정 개수와 시퀀스를 포함 하는 간단한 데이터 구조입니다.A tuple is a lightweight data structure that has a specific number and sequence of values. 튜플을 인스턴스화할 때 각 값 (또는 요소)의 숫자와 데이터 형식을 정의 합니다.When you instantiate the tuple, you define the number and the data type of each value (or element). 예를 들어 2 튜플 (또는 쌍)에는 두 개의 요소가 있습니다.For example, a 2-tuple (or pair) has two elements. 첫 번째 Boolean 값은 값이 고, 두 번째는 일 수 있습니다 String .The first might be a Boolean value, while the second is a String. 튜플을 사용 하면 여러 값을 단일 개체에 쉽게 저장할 수 있으므로 일반적으로 메서드에서 여러 값을 반환 하는 간단한 방법으로 사용 됩니다.Because tuples make it easy to store multiple values in a single object, they are often used as a lightweight way to return multiple values from a method.

중요

튜플을 지원 하려면 ValueTuple 형식이 필요 합니다.Tuple support requires the ValueTuple type. .NET Framework 4.7가 설치 되지 않은 경우 nuget System.ValueTuple 갤러리에서 사용할 수 있는 nuget 패키지를 추가 해야 합니다.If the .NET Framework 4.7 is not installed, you must add the NuGet package System.ValueTuple, which is available on the NuGet Gallery. 이 패키지가 없으면 "미리 정의 된 유형 ' System.valuetuple (Of,,,) '이 (가) 정의 되지 않았거나 가져오지 않았습니다."와 유사한 컴파일 오류가 발생할 수 있습니다.Without this package, you may get a compilation error similar to, "Predefined type 'ValueTuple(Of,,,)' is not defined or imported."

튜플 인스턴스화 및 사용Instantiating and using a tuple

쉼표로 구분 된 값을 괄호로 묶어 튜플을 인스턴스화합니다.You instantiate a tuple by enclosing its comma-delimited values in parentheses. 이러한 각 값은 튜플의 필드가 됩니다.Each of those values then becomes a field of the tuple. 예를 들어, 다음 코드는을 Date 첫 번째 값으로,를 두 번째 값으로,를 세 번째 값으로 사용 하 여 삼중 (또는 3 튜플)을 정의 합니다 String Boolean .For example, the following code defines a triple (or 3-tuple) with a Date as its first value, a String as its second, and a Boolean as its third.

Dim holiday = (#07/04/2017#, "Independence Day", True)

기본적으로 튜플의 각 필드 이름은 Item 튜플의 필드의 1부터 시작 하는 위치와 함께 문자열로 구성 됩니다.By default, the name of each field in a tuple consists of the string Item along with the field's one-based position in the tuple. 이 3 튜플의 필드는이 고, 필드는 이며 Date Item1 String Item2 , Boolean 필드는 Item3 입니다.For this 3-tuple, the Date field is Item1, the String field is Item2, and the Boolean field is Item3. 다음 예제에서는 이전 코드 줄에서 인스턴스화된 튜플의 필드 값을 표시 합니다.The following example displays the values of fields of the tuple instantiated in the previous line of code

Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +
                  $"{If(holiday.Item3, ", a national holiday", String.Empty)}")
' Output: 7/4/2017 12:00:00 AM Is Independence Day, a national holiday

Visual Basic 튜플의 필드는 읽기/쓰기입니다. 튜플을 인스턴스화한 후에는 해당 값을 수정할 수 있습니다.The fields of a Visual Basic tuple are read-write; after you've instantiated a tuple, you can modify its values. 다음 예제에서는 이전 예제에서 만든 튜플의 세 필드 중 두 개를 수정 하 고 결과를 표시 합니다.The following example modifies two of the three fields of the tuple created in the previous example and displays the result.

holiday.Item1 = #01/01/2018#
holiday.Item2 = "New Year's Day"
Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +
                  $"{If(holiday.Item3, ", a national holiday", String.Empty)}")
' Output: 1/1/2018 12:00:00 AM Is New Year's Day, a national holiday

명명 된 튜플 인스턴스화 및 사용Instantiating and using a named tuple

튜플의 필드에 대해 기본 이름을 사용 하는 대신 튜플의 요소에 고유한 이름을 할당 하 여 명명 된 튜플을 인스턴스화할 수 있습니다.Rather than using default names for a tuple's fields, you can instantiate a named tuple by assigning your own names to the tuple's elements. 그러면 지정 된 이름이 기본 이름으로 튜플의 필드에 액세스할 수 있습니다.The tuple's fields can then be accessed by their assigned names or by their default names. 다음 예제에서는 첫 번째 필드 EventDate , 두 번째 및 세 번째 필드의 이름을 명시적으로 지정할 때를 제외 하 고 이전 처럼 동일한 3 튜플을 인스턴스화합니다 Name IsHoliday .The following example instantiates the same 3-tuple as previously, except that it explicitly names the first field EventDate, the second Name, and the third IsHoliday. 그런 다음 필드 값을 표시 하 고 수정 하 고 필드 값을 다시 표시 합니다.It then displays the field values, modifies them, and displays the field values again.

Dim holiday = (EventDate:=#07/04/2017#, Name:="Independence Day", IsHoliday:=True)
Console.WriteLine($"{holiday.EventDate} Is {holiday.Name}" +
                  $"{If(holiday.IsHoliday, ", a national holiday", String.Empty)}")
holiday.Item1 = #01/01/2018#
holiday.Item2 = "New Year's Day"
Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +
                  $"{If(holiday.Item3, ", a national holiday", String.Empty)}")
' The example displays the following output:
'   7/4/2017 12:00:00 AM Is Independence Day, a national holiday
'   1/1/2018 12:00:00 AM Is New Year's Day, a national holiday

유추된 튜플 요소 이름Inferred tuple element names

Visual Basic 15.3부터 Visual Basic 튜플 요소의 이름을 유추할 수 있습니다. 명시적으로 할당할 필요는 없습니다.Starting with Visual Basic 15.3, Visual Basic can infer the names of tuple elements; you do not have to assign them explicitly. 유추 된 튜플 이름은 변수 집합에서 튜플을 초기화 하 고 튜플 요소 이름이 변수 이름과 동일 하 게 하려는 경우에 유용 합니다.Inferred tuple names are useful when you initialize a tuple from a set of variables, and you want the tuple element name to be the same as the variable name.

다음 예에서는 명시적으로 stateInfo 명명 된 세 요소인, 및가 포함 된 튜플을 만듭니다 state stateName capital .The following example creates a stateInfo tuple that contains three explicitly named elements, state, stateName, and capital. 요소 이름을 지정 하는 경우 튜플 초기화 문은 명명 된 요소에 동일한 이름의 변수 값을 할당 하기만 하면 됩니다.Note that, in naming the elements, the tuple initialization statement simply assigns the named elements the values of the identically named variables.

Const state As String = "MI"
Const stateName As String = "Michigan"
Const capital As String = "Lansing"
Dim stateInfo = (state:=state, stateName:=stateName, capital:=capital)
Console.WriteLine($"{stateInfo.stateName}: 2-letter code: {stateInfo.state}, Capital {stateInfo.capital}")
' The example displays the following output:
'      Michigan: 2-letter code: MI, Capital Lansing

요소와 변수는 이름이 동일 하기 때문에 Visual Basic 컴파일러는 다음 예제와 같이 필드의 이름을 유추할 수 있습니다.Because elements and variables have the same name, the Visual Basic compiler can infer the names of the fields, as the following example shows.

Const state As String = "MI"
Const stateName As String = "Michigan"
Const capital As String = "Lansing"
Dim stateInfo = (state, stateName, capital)
Console.WriteLine($"{stateInfo.stateName}: 2-letter code: {stateInfo.State}, Capital {stateInfo.capital}")
' The example displays the following output:
'      Michigan: 2-letter code: MI, Capital Lansing

유추 된 튜플 요소 이름을 사용 하려면 Visual Basic 프로젝트 (.vbproj) 파일에서 사용할 Visual Basic 컴파일러의 버전을 정의 해야 합니다 * .To enable inferred tuple element names, you must define the version of the Visual Basic compiler to use in your Visual Basic project (*.vbproj) file:

<PropertyGroup>
  <LangVersion>15.3</LangVersion>
</PropertyGroup>

버전 번호는 15.3부터 시작 하는 Visual Basic 컴파일러의 모든 버전이 될 수 있습니다.The version number can be any version of the Visual Basic compiler starting with 15.3. 특정 컴파일러 버전을 하드 코딩 하는 대신의 값으로 "최신"을 지정 LangVersion 하 여 시스템에 설치 된 Visual Basic 컴파일러의 최신 버전으로 컴파일할 수도 있습니다.Rather than hard-coding a specific compiler version, you can also specify "Latest" as the value of LangVersion to compile with the most recent version of the Visual Basic compiler installed on your system.

자세한 내용은 Visual Basic 언어 버전 설정을 참조 하세요.For more information, see setting the Visual Basic language version.

경우에 따라 Visual Basic 컴파일러는 후보 이름에서 튜플 요소 이름을 유추할 수 없으며 튜플 필드는, 등의 기본 이름을 사용해 서만 참조할 수 있습니다 Item1 Item2 . 여기에는 다음이 포함 됩니다.In some cases, the Visual Basic compiler cannot infer the tuple element name from the candidate name, and the tuple field can only be referenced using its default name, such as Item1, Item2, etc. These include:

  • 후보 이름은 튜플 멤버의 이름 (예:, 또는)과 동일 합니다 Item3 Rest ToString .The candidate name is the same as the name of a tuple member, such as Item3, Rest, or ToString.

  • 후보 이름이 튜플에 중복 됩니다.The candidate name is duplicated in the tuple.

필드 이름 유추가 실패 하면 Visual Basic는 컴파일러 오류를 생성 하지 않으며 런타임에 예외가 throw 되지 않습니다.When field name inference fails, Visual Basic does not generate a compiler error, nor is an exception thrown at runtime. 대신, 튜플 필드는 및와 같은 미리 정의 된 이름으로 참조 되어야 합니다 Item1 Item2 .Instead, tuple fields must be referenced by their predefined names, such as Item1 and Item2.

튜플 및 구조체Tuples versus structures

Visual Basic 튜플은 system.valuetuple 제네릭 형식 중 하나의 인스턴스인 값 형식입니다.A Visual Basic tuple is a value type that is an instance of one of the a System.ValueTuple generic types. 예를 들어 holiday 이전 예제에서 정의 된 튜플은 구조체의 인스턴스입니다 ValueTuple<T1,T2,T3> .For example, the holiday tuple defined in the previous example is an instance of the ValueTuple<T1,T2,T3> structure. 데이터에 대 한 간단한 컨테이너로 설계 되었습니다.It is designed to be a lightweight container for data. 튜플은 여러 데이터 항목을 사용 하 여 개체를 쉽게 만들 수 있도록 하기 때문에 사용자 지정 구조에 포함 될 수 있는 일부 기능이 부족 합니다.Since the tuple aims to make it easy to create an object with multiple data items, it lacks some of the features that a custom structure might have. 여기에는 다음이 포함됩니다.These include:

  • 사용자 지정 멤버.Custom members. 튜플에 대해 고유한 속성, 메서드 또는 이벤트를 정의할 수 없습니다.You cannot define your own properties, methods, or events for a tuple.

  • 유효성 검사 섹션을 참조하십시오.Validation. 필드에 할당 된 데이터의 유효성을 검사할 수 없습니다.You cannot validate the data assigned to fields.

  • 불변성.Immutability. Visual Basic 튜플을 변경할 수 있습니다.Visual Basic tuples are mutable. 반면, 사용자 지정 구조를 사용 하면 인스턴스를 변경할 수 있는지 여부를 제어할 수 있습니다.In contrast, a custom structure allows you to control whether an instance is mutable or immutable.

사용자 지정 멤버, 속성 및 필드 유효성 검사 또는 불변성이 중요 한 경우에는 Visual Basic Structure 문을 사용 하 여 사용자 지정 값 형식을 정의 해야 합니다.If custom members, property and field validation, or immutability are important, you should use the Visual Basic Structure statement to define a custom value type.

Visual Basic 튜플은 system.valuetuple 형식의 멤버를 상속 합니다.A Visual Basic tuple does inherit the members of its ValueTuple type. 이러한 필드 외에도 다음과 같은 메서드가 포함 됩니다.In addition to its fields, these include the following methods:

방법Method DescriptionDescription
CompareToCompareTo 현재 튜플을 동일한 수의 요소를 사용 하는 다른 튜플로 비교 합니다.Compares the current tuple to another tuple with the same number of elements.
같음Equals 현재 튜플이 다른 튜플 또는 개체와 같은지 여부를 확인 합니다.Determines whether the current tuple is equal to another tuple or object.
GetHashCodeGetHashCode 현재 인스턴스에 대 한 해시 코드를 계산 합니다.Calculates the hash code for the current instance.
ToStringToString 형식을 사용 하는이 튜플의 문자열 표현을 반환 합니다 (Item1, Item2...) . 여기서 및는 Item1 Item2 튜플의 필드 값을 나타냅니다.Returns the string representation of this tuple, which takes the form (Item1, Item2...), where Item1 and Item2 represent the values of the tuple's fields.

또한 system.valuetuple 형식은 IStructuralComparable IStructuralEquatable 사용자 지정 비교자를 정의 하는 데 사용할 수 있는 및 인터페이스를 구현 합니다.In addition, the ValueTuple types implement IStructuralComparable and IStructuralEquatable interfaces, which allow you to define custom comparers.

할당 및 튜플Assignment and tuples

Visual Basic는 필드 수가 같은 튜플 형식 간의 할당을 지원 합니다.Visual Basic supports assignment between tuple types that have the same number of fields. 다음 조건 중 하나에 해당 하는 경우 필드 형식을 변환할 수 있습니다.The field types can be converted if one of the following is true:

  • 원본 및 대상 필드의 형식이 동일 합니다.The source and target field are of the same type.

  • 원본 형식에서 대상 형식으로의 확대 또는 암시적 변환이 정의 됩니다.A widening (or implicit) conversion of the source type to the target type is defined.

  • Option Strict 가이 On 고 원본 형식에서 대상 형식으로의 축소 또는 명시적 변환이 정의 되어 있습니다.Option Strict is On, and a narrowing (or explicit) conversion of the source type to the target type is defined. 소스 값이 대상 형식의 범위를 벗어나면이 변환에서 예외를 throw 할 수 있습니다.This conversion can throw an exception if the source value is outside the range of the target type.

다른 변환은 할당에 고려되지 않습니다.Other conversions are not considered for assignments. 튜플 형식 간에 허용되는 할당 종류를 살펴보겠습니다.Let's look at the kinds of assignments that are allowed between tuple types.

다음 예제에서 사용되는 이러한 변수를 살펴보세요.Consider these variables used in the following examples:

' The number and field types of all these tuples are compatible. 
' The only difference Is the field names being used.
Dim unnamed = (42, "The meaning of life")
Dim anonymous = (16, "a perfect square")
Dim named = (Answer:=42, Message:="The meaning of life")
Dim differentNamed = (SecretConstant:=42, Label:="The meaning of life")

처음 두 변수인 및에 unnamedanonymous 필드에 대해 지정 된 의미 체계 이름이 없습니다.The first two variables, unnamed and anonymous, do not have semantic names provided for the fields. 필드 이름은 기본 Item1Item2 입니다.Their field names are the default Item1 and Item2. 마지막 두 변수인 및에 nameddifferentName 의미 체계 필드 이름이 있습니다.The last two variables, named and differentName have semantic field names. 이러한 두 튜플의 필드 이름은 서로 다릅니다.Note that these two tuples have different names for the fields.

이러한 튜플 중 4 개는 동일한 수의 필드 (' 인자 ' 라고 함)를 포함 하 고 이러한 필드의 형식은 동일 합니다.All four of these tuples have the same number of fields (referred to as 'arity'), and the types of those fields are identical. 따라서 다음 할당이 모든 작동합니다.Therefore, all of these assignments work:

' Assign named to unnamed.
named = unnamed

' Despite the assignment, named still has fields that can be referred to as 'answer' and 'message'.
Console.WriteLine($"{named.Answer}, {named.Message}")
' Output:  42, The meaning of life

' Assign unnamed to anonymous.
anonymous = unnamed
' Because of the assignment, the value of the elements of anonymous changed.
Console.WriteLine($"{anonymous.Item1}, {anonymous.Item2}")
' Output:   42, The meaning of life

' Assign one named tuple to the other.
named = differentNamed
' The field names are Not assigned. 'named' still has 'answer' and 'message' fields.
Console.WriteLine($"{named.Answer}, {named.Message}")
' Output:   42, The meaning of life

튜플 이름은 할당되지 않습니다.Notice that the names of the tuples are not assigned. 필드 값은 튜플의 필드 순서에 따라 할당됩니다.The values of the fields are assigned following the order of the fields in the tuple.

마지막으로 named conversion 의 첫 번째 필드가 namedInteger 고의 첫 번째 conversion Long 필드가 인 경우에도 튜플에 튜플을 할당할 수 있습니다.Finally, notice that we can assign the named tuple to the conversion tuple, even though the first field of named is an Integer, and the first field of conversion is a Long. Integer을로 변환 하는 Long 것은 확대 변환 이므로이 할당은 성공 합니다.This assignment succeeds because converting an Integer to a Long is a widening conversion.

' Assign an (Integer, String) tuple to a (Long, String) tuple (using implicit conversion).
Dim conversion As (Long, String) = named
Console.WriteLine($"{conversion.Item1} ({conversion.Item1.GetType().Name}), " +
                  $"{conversion.Item2} ({conversion.Item2.GetType().Name})")
' Output:      42 (Int64), The meaning of life (String)

필드 수가 다른 튜플은 할당할 수 없습니다.Tuples with different numbers of fields are not assignable:

' Does not compile.
' VB30311: Value of type '(Integer, Integer, Integer)' cannot be converted
'          to '(Answer As Integer, Message As String)'
var differentShape = (1, 2, 3)
named = differentShape

메서드 반환 값으로의 튜플Tuples as method return values

메서드는 단일 값만 반환할 수 있습니다.A method can return only a single value. 그러나 메서드를 호출 하 여 여러 값을 반환 하는 경우가 많습니다.Frequently, though, you'd like a method call to return multiple values. 이 제한 사항을 해결 하는 데는 여러 가지 방법이 있습니다.There are several ways to work around this limitation:

  • 속성이 나 필드가 메서드에서 반환 된 값을 나타내는 사용자 지정 클래스 또는 구조체를 만들 수 있습니다.You can create a custom class or structure whose properties or fields represent values returned by the method. 따라서는 고중량 솔루션입니다. 메서드 호출에서 값을 검색 하는 용도로만 사용 되는 사용자 지정 형식을 정의 해야 합니다.Thus is a heavyweight solution; it requires that you define a custom type whose only purpose is to retrieve values from a method call.

  • 메서드에서 단일 값을 반환 하 고, 메서드에 대 한 참조로 전달 하 여 나머지 값을 반환할 수 있습니다.You can return a single value from the method, and return the remaining values by passing them by reference to the method. 여기에는 변수를 인스턴스화하는 오버 헤드가 발생 하며 실수로 참조로 전달 하는 변수의 값을 덮어쓰는 위험이 포함 됩니다.This involves the overhead of instantiating a variable and risks inadvertently overwriting the value of the variable that you pass by reference.

  • 여러 반환 값을 검색 하는 간단한 솔루션을 제공 하는 튜플을 사용할 수 있습니다.You can use a tuple, which provides a lightweight solution to retrieving multiple return values.

예를 들어 .NET의 TryParse 메서드는 Boolean 구문 분석 작업이 성공 했는지 여부를 나타내는 값을 반환 합니다.For example, the TryParse methods in .NET return a Boolean value that indicates whether the parsing operation succeeded. 구문 분석 작업의 결과는 메서드에 대 한 참조로 전달 된 변수에 반환 됩니다.The result of the parsing operation is returned in a variable passed by reference to the method. 일반적으로와 같은 구문 분석 메서드를 호출 하는 것은 Int32.TryParse 다음과 같습니다.Normally, a call to the a parsing method such as Int32.TryParse looks like the following:

Dim numericString As String = "123456"
Dim number As Integer
Dim result = Int32.TryParse(numericString, number)
Console.WriteLine($"{If(result, $"Success: {number:N0}", "Failure")}")
'      Output: 123,456

자체 메서드에서 메서드에 대 한 호출을 래핑하는 경우 구문 분석 작업에서 튜플을 반환할 수 있습니다 Int32.TryParse .We can return a tuple from the parsing operation if we wrap the call to the Int32.TryParse method in our own method. 다음 예제에서는 메서드를 NumericLibrary.ParseInteger 호출 Int32.TryParse 하 고 두 개의 요소가 있는 명명 된 튜플을 반환 합니다.In the following example, NumericLibrary.ParseInteger calls the Int32.TryParse method and returns a named tuple with two elements.

Imports System.Globalization

Public Module NumericLibrary
    Public Function ParseInteger(value As String) As (Success As Boolean, Number As Int32)
        Dim number As Integer
        Return (Int32.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, number), number)
    End Function
End Module

그런 다음 다음과 같은 코드를 사용 하 여 메서드를 호출할 수 있습니다.You can then call the method with code like the following:

Dim numericString As String = "123,456"
Dim result = ParseInteger(numericString)
Console.WriteLine($"{If(result.Success, $"Success: {result.Number:N0}", "Failure")}")
Console.ReadLine()
'      Output: Success: 123,456

.NET Framework에서 튜플 및 튜플 Visual BasicVisual Basic tuples and tuples in the .NET Framework

Visual Basic 튜플은 .NET Framework 4.7에 도입 된 system.valuetuple 제네릭 형식 중 하나의 인스턴스입니다.A Visual Basic tuple is an instance of one of the System.ValueTuple generic types, which were introduced in the .NET Framework 4.7. 또한 .NET Framework에 는 제네릭 system.string 클래스 집합이 포함 되어 있습니다.The .NET Framework also includes a set of generic System.Tuple classes. 그러나 이러한 클래스는 Visual Basic 튜플 및 여러 가지 방법으로 system.valuetuple 제네릭 형식과 다릅니다.These classes, however, differ from Visual Basic tuples and the System.ValueTuple generic types in a number of ways:

  • 튜플 클래스의 요소는, 등의 속성 Item1 Item2 입니다.The elements of the Tuple classes are properties named Item1, Item2, and so on. Visual Basic 튜플 및 system.valuetuple 형식에서 튜플 요소는 필드입니다.In Visual Basic tuples and the ValueTuple types, tuple elements are fields.

  • 튜플 인스턴스 또는 system.valuetuple 인스턴스의 요소에 의미 있는 이름을 할당할 수 없습니다.You cannot assign meaningful names to the elements of a Tuple instance or of a ValueTuple instance. Visual Basic를 사용 하 여 필드의 의미를 전달 하는 이름을 할당할 수 있습니다.Visual Basic allows you to assign names that communicate the meaning of the fields.

  • 튜플 인스턴스의 속성은 읽기 전용입니다. 튜플을 변경할 수 없습니다.The properties of a Tuple instance are read-only; the tuples are immutable. Visual Basic 튜플 및 system.valuetuple 형식에서 튜플 필드는 읽기/쓰기입니다. 튜플을 변경할 수 있습니다.In Visual Basic tuples and the ValueTuple types, tuple fields are read-write; the tuples are mutable.

  • 제네릭 튜플 형식은 참조 형식입니다.The generic Tuple types are reference types. 이러한 튜플 형식을 사용 하면 개체 할당을 의미 합니다.Using these Tuple types means allocating objects. 실행 부하 과다 경로에서는 이로 인해 애플리케이션 성능이 크게 영향을 받을 수 있습니다.On hot paths, this can have a measurable impact on your application's performance. Visual Basic 튜플 및 system.valuetuple 형식은 값 형식입니다.Visual Basic tuples and the ValueTuple types are value types.

클래스의 확장 메서드를 사용 TupleExtensions 하면 Visual Basic 튜플 및 .Net 튜플 개체 간에 쉽게 변환할 수 있습니다.Extension methods in the TupleExtensions class make it easy to convert between Visual Basic tuples and .NET Tuple objects. Totuple 메서드는 Visual Basic 튜플을 .net 튜플 개체로 변환 하 고, ToValueTuple 메서드는 .net 튜플 개체를 Visual Basic 튜플로 변환 합니다.The ToTuple method converts a Visual Basic tuple to a .NET Tuple object, and the ToValueTuple method converts a .NET Tuple object to a Visual Basic tuple.

다음 예제에서는 튜플을 만들고 .NET 튜플 개체로 변환한 다음 다시 Visual Basic 튜플로 변환 합니다.The following example creates a tuple, converts it to a .NET Tuple object, and converts it back to a Visual Basic tuple. 그런 다음이 튜플을 원래 튜플과 비교 하 여 동일한 지 확인 합니다.The example then compares this tuple with the original one to ensure that they are equal.

Module Example
    Sub Main()
        Dim cityInfo = (name:="New York", area:=468.5, population:=8_550_405)
        Console.WriteLine($"{cityInfo}, type {cityInfo.GetType().Name}")

        ' Convert the Visual Basic tuple to a .NET tuple.
        Dim cityInfoT = TupleExtensions.ToTuple(cityInfo)
        Console.WriteLine($"{cityInfoT}, type {cityInfoT.GetType().Name}")

        ' Convert the .NET tuple back to a Visual Basic tuple and ensure they are the same.
        Dim cityInfo2 = TupleExtensions.ToValueTuple(cityInfoT)
        Console.WriteLine($"{cityInfo2}, type {cityInfo2.GetType().Name}")
        Console.WriteLine($"{NameOf(cityInfo)} = {NameOf(cityInfo2)}: {cityInfo.Equals(cityInfo2)}")
        Console.ReadLine()
    End Sub
End Module
' The example displays the following output:
'       (New York, 468.5, 8550405), type ValueTuple`3
'       (New York, 468.5, 8550405), type Tuple`3
'       (New York, 468.5, 8550405), type ValueTuple`3
'       cityInfo = cityInfo2 :  True

참조See also