The .NET Compiler Platform ("Roslyn") provides open-source C# and Visual Basic compilers with rich code analysis APIs.
jcouv on main
Lifted relational operator impl… (compare)
await
instead of .Result
public static IEnumerator GetEnumerator(this System.ValueTuple<int, int, int> range)
{
int start = range.Item1;
int end = range.Item2;
int step = range.Item3;
if (step > 0)
for (int i = start; i <= end; i += step)
yield return i;
else
for (int i = start; i >= end; i += step)
yield return i;
}
foreach (int i in (-10, 10, 3))
Console.WriteLine(i);
Sub Main(args As String())
For Each i In (1, 10, 2).GetEnumerator()
Console.WriteLine(i)
Next
Imports System.Runtime.CompilerServices
Public Module Tools
<Extension>
Public Iterator Function GetEnumerator(range As ValueTuple(Of Integer, Integer, Integer)) As IEnumerable
Dim start = range.Item1
Dim [end] = range.Item2
Dim [step] = range.Item3
If ([step] > 0) Then
For i = start To [end] Step [step]
Yield i
Next
Else
For i = start To [end] Step [step]
Yield i
Next
End If
End Function
End Module
(1, 10, 2).GetEnumerator()
expression works, but (1, 10, 2)
doesn't!
foreach
binds. There's nothing special about the GetEnumerator
method. Just C# recognizes certain patterns when lowering foreach
and VB a different set.