Fun with C#’s local functions – part 2
I was speaking about new features in C# 7.x and 8 some days ago and as the questions came in, some were really good small brainstorming, basically trying where C# compiler limits are. And that’s always interesting to me.
From this brainstorming I have two interesting pieces. This is the other one and the first one is here.
Local function can be called before it’s declared. Same as in the rest of C#. Very simple example.
public static void FooBar()
{
Test();
int Test() => 10;
}
Can I (ab)use this function to access variable before it’s declared (from the point where I’m calling the local function)? Let’s find out.
public static void FooBar()
{
var i = 10;
int Test() => i;
}
So far so good. It compiles and from the previous example I know I can call a local function before it’s declared. Here we go.
public static void FooBar()
{
Test();
var i = 10;
int Test() => i;
}
And it fails to compile. The error message is Use of unassigned local variable 'i'
, which thinking about it makes sense. Of course, moving the Test
call after i
declaration and assignment makes the error disappear. Interesting to see the compiler has “reachability” (that’s my term, I don’t know how it’s really called) graph that’s not just local.
But let’s not give up too soon. Maybe I can access it via another local function defined before the i
.
public static void FooBar()
{
int Test2() => Test();
Test2();
var i = 10;
int Test() => i;
}
Does this work? No. Same error. The “reachability” graph clearly works.
Although this was a one-minute fun during my talk, I have a feeling it’s not over and I’ll spend trying to access that variable in the future. 😃