arrays - Got surprised knowing that C# compiler can infer less informative declaration -
consider following code snippet follow mind chronologically. commented statements cannot compiled.
var data1 = new int[3] { 1, 2, 3 }; var data2 = new int[] { 1, 2, 3 }; var data3 = new[] { 1, 2, 3 }; var data4 = new[] { 1, 2, 3.0f }; the simplification done data3 , data4 understandable.
int[] data5 = { 1, 2, 3 }; //var data6 = { 1, 2, 3 }; unable infer declaration data6 understandable.
var data7 = new int[] { }; //var data8 = new [] { }; //int[] data9 = new [] { }; unable infer declaration data8 understandable.
what don't understand why data9 more informative cannot compiled while data10 less informative can compiled.
int[] data10 = { }; //var data11 = { }; declaring data11 cannot compiled understandable.
the cases there new keyword present, usual expressions can used in context expression required. use them declarations assignment, can used in other contexts, example:
return new[] { 3 }; or:
call(new[] { 3 }); and on. in these new array expressions, type must clear expression itself. required when there variable declaration on left.
the case data9 therefore, int[] data9 = new [] { }; illegal because expression new[] { } illegal. like:
object related9 = someboolean ? "yes" : new exception(); which illegal because expression someboolean ? "yes" : new exception() illegal in itself, incompatible types. there declaration of type object, not make right-hand side legal.
the examples data5 , data10 show unrelated syntax array variable declaration.
int[] data5 = { 1, 2, 3 }; here right-hand side of = operator not expression in itself. syntax requires declaration explicit type on left of = sign (so data6 not ok). syntax related object initializers , collection initializers , introduced in c# language them, whereas new[] { ... } syntax bit older.
you should see this answer lippert, read official c# language specification.
Comments
Post a Comment