@@ -2018,8 +2018,8 @@ int IStructuralComparable.CompareTo(object? other, IComparer comparer)
2018
2018
/// <returns>A 32-bit signed integer hash code.</returns>
2019
2019
public override int GetHashCode ( )
2020
2020
{
2021
- // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple
2022
- if ( ! ( Rest is IValueTupleInternal rest ) )
2021
+ // We want to have a limited hash in this case. We'll use the first 7 elements of the tuple
2022
+ if ( ! ( Rest is IValueTupleInternal ) )
2023
2023
{
2024
2024
return HashCode . Combine ( Item1 ? . GetHashCode ( ) ?? 0 ,
2025
2025
Item2 ? . GetHashCode ( ) ?? 0 ,
@@ -2030,46 +2030,50 @@ public override int GetHashCode()
2030
2030
Item7 ? . GetHashCode ( ) ?? 0 ) ;
2031
2031
}
2032
2032
2033
- int size = rest . Length ;
2034
- if ( size >= 8 ) { return rest . GetHashCode ( ) ; }
2033
+ int size = ( ( IValueTupleInternal ) Rest ) . Length ;
2034
+ int restHashCode = Rest . GetHashCode ( ) ;
2035
+ if ( size >= 8 )
2036
+ {
2037
+ return restHashCode ;
2038
+ }
2035
2039
2036
- // In this case, the rest member has less than 8 elements so we need to combine some our elements with the elements in rest
2040
+ // In this case, the rest member has less than 8 elements so we need to combine some of our elements with the elements in rest
2037
2041
int k = 8 - size ;
2038
2042
switch ( k )
2039
2043
{
2040
2044
case 1 :
2041
2045
return HashCode . Combine ( Item7 ? . GetHashCode ( ) ?? 0 ,
2042
- rest . GetHashCode ( ) ) ;
2046
+ restHashCode ) ;
2043
2047
case 2 :
2044
2048
return HashCode . Combine ( Item6 ? . GetHashCode ( ) ?? 0 ,
2045
2049
Item7 ? . GetHashCode ( ) ?? 0 ,
2046
- rest . GetHashCode ( ) ) ;
2050
+ restHashCode ) ;
2047
2051
case 3 :
2048
2052
return HashCode . Combine ( Item5 ? . GetHashCode ( ) ?? 0 ,
2049
2053
Item6 ? . GetHashCode ( ) ?? 0 ,
2050
2054
Item7 ? . GetHashCode ( ) ?? 0 ,
2051
- rest . GetHashCode ( ) ) ;
2055
+ restHashCode ) ;
2052
2056
case 4 :
2053
2057
return HashCode . Combine ( Item4 ? . GetHashCode ( ) ?? 0 ,
2054
2058
Item5 ? . GetHashCode ( ) ?? 0 ,
2055
2059
Item6 ? . GetHashCode ( ) ?? 0 ,
2056
2060
Item7 ? . GetHashCode ( ) ?? 0 ,
2057
- rest . GetHashCode ( ) ) ;
2061
+ restHashCode ) ;
2058
2062
case 5 :
2059
2063
return HashCode . Combine ( Item3 ? . GetHashCode ( ) ?? 0 ,
2060
2064
Item4 ? . GetHashCode ( ) ?? 0 ,
2061
2065
Item5 ? . GetHashCode ( ) ?? 0 ,
2062
2066
Item6 ? . GetHashCode ( ) ?? 0 ,
2063
2067
Item7 ? . GetHashCode ( ) ?? 0 ,
2064
- rest . GetHashCode ( ) ) ;
2068
+ restHashCode ) ;
2065
2069
case 6 :
2066
2070
return HashCode . Combine ( Item2 ? . GetHashCode ( ) ?? 0 ,
2067
2071
Item3 ? . GetHashCode ( ) ?? 0 ,
2068
2072
Item4 ? . GetHashCode ( ) ?? 0 ,
2069
2073
Item5 ? . GetHashCode ( ) ?? 0 ,
2070
2074
Item6 ? . GetHashCode ( ) ?? 0 ,
2071
2075
Item7 ? . GetHashCode ( ) ?? 0 ,
2072
- rest . GetHashCode ( ) ) ;
2076
+ restHashCode ) ;
2073
2077
case 7 :
2074
2078
case 8 :
2075
2079
return HashCode . Combine ( Item1 ? . GetHashCode ( ) ?? 0 ,
@@ -2079,7 +2083,7 @@ public override int GetHashCode()
2079
2083
Item5 ? . GetHashCode ( ) ?? 0 ,
2080
2084
Item6 ? . GetHashCode ( ) ?? 0 ,
2081
2085
Item7 ? . GetHashCode ( ) ?? 0 ,
2082
- rest . GetHashCode ( ) ) ;
2086
+ restHashCode ) ;
2083
2087
}
2084
2088
2085
2089
Debug . Fail ( "Missed all cases for computing ValueTuple hash code" ) ;
@@ -2093,7 +2097,7 @@ int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
2093
2097
2094
2098
private int GetHashCodeCore ( IEqualityComparer comparer )
2095
2099
{
2096
- // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple
2100
+ // We want to have a limited hash in this case. We'll use the first 7 elements of the tuple
2097
2101
if ( ! ( Rest is IValueTupleInternal rest ) )
2098
2102
{
2099
2103
return HashCode . Combine ( comparer . GetHashCode ( Item1 ! ) , comparer . GetHashCode ( Item2 ! ) , comparer . GetHashCode ( Item3 ! ) ,
@@ -2102,34 +2106,59 @@ private int GetHashCodeCore(IEqualityComparer comparer)
2102
2106
}
2103
2107
2104
2108
int size = rest . Length ;
2105
- if ( size >= 8 ) { return rest . GetHashCode ( comparer ) ; }
2109
+ int restHashCode = rest . GetHashCode ( comparer ) ;
2110
+ if ( size >= 8 )
2111
+ {
2112
+ return restHashCode ;
2113
+ }
2106
2114
2107
2115
// In this case, the rest member has less than 8 elements so we need to combine some our elements with the elements in rest
2108
2116
int k = 8 - size ;
2109
2117
switch ( k )
2110
2118
{
2111
2119
case 1 :
2112
- return HashCode . Combine ( comparer . GetHashCode ( Item7 ! ) , rest . GetHashCode ( comparer ) ) ;
2120
+ return HashCode . Combine ( comparer . GetHashCode ( Item7 ! ) ,
2121
+ restHashCode ) ;
2113
2122
case 2 :
2114
- return HashCode . Combine ( comparer . GetHashCode ( Item6 ! ) , comparer . GetHashCode ( Item7 ! ) , rest . GetHashCode ( comparer ) ) ;
2123
+ return HashCode . Combine ( comparer . GetHashCode ( Item6 ! ) ,
2124
+ comparer . GetHashCode ( Item7 ! ) ,
2125
+ restHashCode ) ;
2115
2126
case 3 :
2116
- return HashCode . Combine ( comparer . GetHashCode ( Item5 ! ) , comparer . GetHashCode ( Item6 ! ) , comparer . GetHashCode ( Item7 ! ) ,
2117
- rest . GetHashCode ( comparer ) ) ;
2127
+ return HashCode . Combine ( comparer . GetHashCode ( Item5 ! ) ,
2128
+ comparer . GetHashCode ( Item6 ! ) ,
2129
+ comparer . GetHashCode ( Item7 ! ) ,
2130
+ restHashCode ) ;
2118
2131
case 4 :
2119
- return HashCode . Combine ( comparer . GetHashCode ( Item4 ! ) , comparer . GetHashCode ( Item5 ! ) , comparer . GetHashCode ( Item6 ! ) ,
2120
- comparer . GetHashCode ( Item7 ! ) , rest . GetHashCode ( comparer ) ) ;
2132
+ return HashCode . Combine ( comparer . GetHashCode ( Item4 ! ) ,
2133
+ comparer . GetHashCode ( Item5 ! ) ,
2134
+ comparer . GetHashCode ( Item6 ! ) ,
2135
+ comparer . GetHashCode ( Item7 ! ) ,
2136
+ restHashCode ) ;
2121
2137
case 5 :
2122
- return HashCode . Combine ( comparer . GetHashCode ( Item3 ! ) , comparer . GetHashCode ( Item4 ! ) , comparer . GetHashCode ( Item5 ! ) ,
2123
- comparer . GetHashCode ( Item6 ! ) , comparer . GetHashCode ( Item7 ! ) , rest . GetHashCode ( comparer ) ) ;
2138
+ return HashCode . Combine ( comparer . GetHashCode ( Item3 ! ) ,
2139
+ comparer . GetHashCode ( Item4 ! ) ,
2140
+ comparer . GetHashCode ( Item5 ! ) ,
2141
+ comparer . GetHashCode ( Item6 ! ) ,
2142
+ comparer . GetHashCode ( Item7 ! ) ,
2143
+ restHashCode ) ;
2124
2144
case 6 :
2125
- return HashCode . Combine ( comparer . GetHashCode ( Item2 ! ) , comparer . GetHashCode ( Item3 ! ) , comparer . GetHashCode ( Item4 ! ) ,
2126
- comparer . GetHashCode ( Item5 ! ) , comparer . GetHashCode ( Item6 ! ) , comparer . GetHashCode ( Item7 ! ) ,
2127
- rest . GetHashCode ( comparer ) ) ;
2145
+ return HashCode . Combine ( comparer . GetHashCode ( Item2 ! ) ,
2146
+ comparer . GetHashCode ( Item3 ! ) ,
2147
+ comparer . GetHashCode ( Item4 ! ) ,
2148
+ comparer . GetHashCode ( Item5 ! ) ,
2149
+ comparer . GetHashCode ( Item6 ! ) ,
2150
+ comparer . GetHashCode ( Item7 ! ) ,
2151
+ restHashCode ) ;
2128
2152
case 7 :
2129
2153
case 8 :
2130
- return HashCode . Combine ( comparer . GetHashCode ( Item1 ! ) , comparer . GetHashCode ( Item2 ! ) , comparer . GetHashCode ( Item3 ! ) ,
2131
- comparer . GetHashCode ( Item4 ! ) , comparer . GetHashCode ( Item5 ! ) , comparer . GetHashCode ( Item6 ! ) ,
2132
- comparer . GetHashCode ( Item7 ! ) , rest . GetHashCode ( comparer ) ) ;
2154
+ return HashCode . Combine ( comparer . GetHashCode ( Item1 ! ) ,
2155
+ comparer . GetHashCode ( Item2 ! ) ,
2156
+ comparer . GetHashCode ( Item3 ! ) ,
2157
+ comparer . GetHashCode ( Item4 ! ) ,
2158
+ comparer . GetHashCode ( Item5 ! ) ,
2159
+ comparer . GetHashCode ( Item6 ! ) ,
2160
+ comparer . GetHashCode ( Item7 ! ) ,
2161
+ restHashCode ) ;
2133
2162
}
2134
2163
2135
2164
Debug . Fail ( "Missed all cases for computing ValueTuple hash code" ) ;
@@ -2151,19 +2180,19 @@ int IValueTupleInternal.GetHashCode(IEqualityComparer comparer)
2151
2180
/// </remarks>
2152
2181
public override string ToString ( )
2153
2182
{
2154
- if ( Rest is IValueTupleInternal rest )
2183
+ if ( Rest is IValueTupleInternal )
2155
2184
{
2156
- return "(" + Item1 ? . ToString ( ) + ", " + Item2 ? . ToString ( ) + ", " + Item3 ? . ToString ( ) + ", " + Item4 ? . ToString ( ) + ", " + Item5 ? . ToString ( ) + ", " + Item6 ? . ToString ( ) + ", " + Item7 ? . ToString ( ) + ", " + rest . ToStringEnd ( ) ;
2185
+ return "(" + Item1 ? . ToString ( ) + ", " + Item2 ? . ToString ( ) + ", " + Item3 ? . ToString ( ) + ", " + Item4 ? . ToString ( ) + ", " + Item5 ? . ToString ( ) + ", " + Item6 ? . ToString ( ) + ", " + Item7 ? . ToString ( ) + ", " + ( ( IValueTupleInternal ) Rest ) . ToStringEnd ( ) ;
2157
2186
}
2158
2187
2159
2188
return "(" + Item1 ? . ToString ( ) + ", " + Item2 ? . ToString ( ) + ", " + Item3 ? . ToString ( ) + ", " + Item4 ? . ToString ( ) + ", " + Item5 ? . ToString ( ) + ", " + Item6 ? . ToString ( ) + ", " + Item7 ? . ToString ( ) + ", " + Rest . ToString ( ) + ")" ;
2160
2189
}
2161
2190
2162
2191
string IValueTupleInternal . ToStringEnd ( )
2163
2192
{
2164
- if ( Rest is IValueTupleInternal rest )
2193
+ if ( Rest is IValueTupleInternal )
2165
2194
{
2166
- return Item1 ? . ToString ( ) + ", " + Item2 ? . ToString ( ) + ", " + Item3 ? . ToString ( ) + ", " + Item4 ? . ToString ( ) + ", " + Item5 ? . ToString ( ) + ", " + Item6 ? . ToString ( ) + ", " + Item7 ? . ToString ( ) + ", " + rest . ToStringEnd ( ) ;
2195
+ return Item1 ? . ToString ( ) + ", " + Item2 ? . ToString ( ) + ", " + Item3 ? . ToString ( ) + ", " + Item4 ? . ToString ( ) + ", " + Item5 ? . ToString ( ) + ", " + Item6 ? . ToString ( ) + ", " + Item7 ? . ToString ( ) + ", " + ( ( IValueTupleInternal ) Rest ) . ToStringEnd ( ) ;
2167
2196
}
2168
2197
2169
2198
return Item1 ? . ToString ( ) + ", " + Item2 ? . ToString ( ) + ", " + Item3 ? . ToString ( ) + ", " + Item4 ? . ToString ( ) + ", " + Item5 ? . ToString ( ) + ", " + Item6 ? . ToString ( ) + ", " + Item7 ? . ToString ( ) + ", " + Rest . ToString ( ) + ")" ;
@@ -2172,7 +2201,7 @@ string IValueTupleInternal.ToStringEnd()
2172
2201
/// <summary>
2173
2202
/// The number of positions in this data structure.
2174
2203
/// </summary>
2175
- int ITuple . Length => Rest is IValueTupleInternal rest ? 7 + rest . Length : 8 ;
2204
+ int ITuple . Length => Rest is IValueTupleInternal ? 7 + ( ( IValueTupleInternal ) Rest ) . Length : 8 ;
2176
2205
2177
2206
/// <summary>
2178
2207
/// Get the element at position <param name="index"/>.
@@ -2199,9 +2228,9 @@ string IValueTupleInternal.ToStringEnd()
2199
2228
return Item7 ;
2200
2229
}
2201
2230
2202
- if ( Rest is IValueTupleInternal rest )
2231
+ if ( Rest is IValueTupleInternal )
2203
2232
{
2204
- return rest [ index - 7 ] ;
2233
+ return ( ( IValueTupleInternal ) Rest ) [ index - 7 ] ;
2205
2234
}
2206
2235
2207
2236
0 commit comments