For the reasons that I still do not understand (see this SO question) multidimensional arrays in CLR do not implement IEnumerable<T>. So the following does not compile:
var m = new int[2,2] {{1, 2}, {3, 4}}; var q = from e in m select e;
Then how come that this works just fine in VB.NET?
Sub Main() Dim m(,) As Integer = {{1, 2}, {3, 4}} Dim q = From e In m Select e For Each i In q Console.WriteLine(i) Next End Sub
Update:
The following code works because the C# compiler replaces the foreach with for loops to go through each dimension.
foreach(var e in m) Console.WriteLine(e);
becomes
int[,] numArray3 = new int[,] { { 2, 2 }, { 3, 3 } }; int upperBound = numArray3.GetUpperBound(0); int num4 = numArray3.GetUpperBound(1); for (int i = numArray3.GetLowerBound(0); i <= upperBound; i++) { for (int j = numArray3.GetLowerBound(1); j <= num4; j++) { int num = numArray3[i, j]; Console.WriteLine(num); } }
The query works in VB.Net because it gets transformed into
This works because you can call
Cast<TResult>() onIEnumerable, which[*,*]implements.The LINQ query doesn’t work in C# because of the different approach the C# and VB.Net designers took. VB.Net takes a more hand holding approach and fixes your mistake and converts
IEnumerabletoIEnumerable<object>so it can be used.In C#, you can simulate this by using