# Can you cancel the stackoverflow exception in the following code? [closed]

The following code will produce a run-time error, stackoverflow exception.

class Foo
{
//static Foo foo = new Foo(); // you are not allowed using this approach
//static readonly Foo foo = new Foo(); // you are not allowed using this approach
Foo foo = new Foo();
}
class Program
{
static void Main(string[] args)
{
new Foo();
}
}


The objective is to cancel the exception without

• removing, modifying or commenting out the existing code,
• using the approaches mentioned (and their variants in access modifiers, public, private, etc) as the given comments,
• using try-catch-finally or its variants,
• using attributes,
• using compilation condition,

You are only allowed to add your own code inside the Foo class. How do you cancel the exception at run-time?

• It would be best to tag this question as either popularity-contest or code-golf so it's clear how you will objectively declare a winner. – Darren Stone Jan 6 '14 at 1:51
• I probably will add more rules if your ideas are too trivial. Sorry for this inconvenience. – kiss my armpit Jan 6 '14 at 2:02
• Pulling the rug out like that may be considered rude. It's best to think your question through thoroughly before asking the internet to spend effort on it. :-) – Darren Stone Jan 6 '14 at 2:10
• This is a popularity-contest yet the accepted answer has few votes. You should accept the highest-voted answer (see popularity-contest) – Justin Jan 10 '14 at 3:43
• @Quincunx: I changed the tag. – kiss my armpit Jan 10 '14 at 3:58

Never wrote C# before, does this work ?

class Foo
{
Foo fooExit = exitMe();
//static Foo foo = new Foo(); // you are not allowed using this approach
//static readonly Foo foo = new Foo(); // you are not allowed using this approach
Foo foo = new Foo();

static Foo exitMe()
{
System.Environment.Exit(0);
return null;
}
}
class Program
{
static void Main(string[] args)
{
new Foo();
}
}

• Well, the rules forbid "using attributes". – Victor Stafusa Jan 6 '14 at 2:24
• @Victor: The code above does not contain any attributes. – kiss my armpit Jan 6 '14 at 2:25
• @StiffJokes Interesting. I am from Java and never programmed in C#. In Java the Foo fooExit = exitMe(); would be a declaration of an attribute called fooExit. I.E. For me attribute and field were synonyms. Googling this, it looks like that in C# attributes are more-or-less what in java are called annotations. Thank you, did not knew this! – Victor Stafusa Jan 6 '14 at 2:32
• I changed the tag just for attracting more creative method. :-) – kiss my armpit Jan 6 '14 at 2:36
• The winner might be different from the accepted answer. It does not matter for me. – kiss my armpit Jan 6 '14 at 13:06

Here, another try:

class Foo
{
//static Foo foo = new Foo(); // you are not allowed using this approach
//static readonly Foo foo = new Foo(); // you are not allowed using this approach
Foo foo = new Foo();
MWAHAHAHA, THIS LINE GIVES A COMPILE ERROR! NO STACKOVERFLOW EXCEPTION ANYMORE! LOL
}
class Program
{
static void Main(string[] args)
{
new Foo();
}
}

• It is really funny, really. – kiss my armpit Jan 6 '14 at 2:20
• That's what I was gonna do... – boothby Jan 6 '14 at 2:43

class Foo
{
//static Foo foo = new Foo(); // you are not allowed using this approach
//static readonly Foo foo = new Foo(); // you are not allowed using this approach
String str = @"
Foo foo = new Foo();
";
}
class Program
{
static void Main(string[] args)
{
new Foo();
}
}

class Foo
{
public class Bar
{
Foo foo = new Foo();
}
}
class Program
{
static void Main(string[] args)
{
new Foo();
}
}


I don't have a C# compiler at hand, but I suspect this might work. The idea is to put the definition in a nested class, such that foo would only be assigned if an instance of Bar is created. Now, the problem is that (I believe) the nested class needs to be public. I don't know if this is a rule violation, i.e. that the rule applies to any use of an access modifier, or only if applied to foo. (Could someone who can compile C# please try this with and without the public?)

• Works with and without public. You also could've tested this on an online compiler, e.g. ideone. – Bob Jan 6 '14 at 6:04
class Foo
{
Foo(bool recursion = false)
{
if (recursion)
Foo foo = new Foo();
}
}
class Program
{
static void Main(string[] args)
{
new Foo();
}
}


To simplify Florent's code:

class Foo
{
Foo foo = new Foo();

static Foo() {
System.Environment.Exit(1);
}

}

• Does this actually work? Won't Foo foo = new Foo(); be (recursively) evaluated before any constructor is executed? – nitro2k01 Feb 18 '14 at 9:35
• @nitro2k01 No, it won't. The static ctor is executed before any instance member initialization. – Andris Feb 18 '14 at 10:07
class Foo
{
while (true);
Foo foo = new Foo();
}
class Program
{
static void Main(string[] args)
{
new Foo();
}
}


Its not a bug, it's a feature!

In case that doesn't work

class Foo
if(false)
Foo foo = new Foo();
}

class Program
{

static void Main(string[] args)
{
new Foo();
}
}

• I guess that stopping stack overflow from happening by making infinite loop prior to it counts. It doesn't appear to be disallowed. – Konrad Borowski Jan 10 '14 at 13:27
• @xfix Indeed. Since the problematic code will never be executed, it cannot cause a lockup. Aka: You cannot lock me up because I'll lock me up first :-P – Mark Jan 10 '14 at 13:30
• I can't see how that would compile in C#. I'm getting a Invalid token 'while' in class, struct, or interface member declaration compiler error with your code. – Andris Jan 10 '14 at 13:39
• @Mark - Hmmm, seems a little passive-aggressive... ;) I like it. – simon Jan 13 '14 at 22:38
• @simon It's called c-SHARP, because its not for the soft-hearted :-P – Mark Jan 14 '14 at 6:39

class Foo
{
//static Foo foo = new Foo(); // you are not allowed using this approach
//static readonly Foo foo = new Foo(); // you are not allowed using this approach

public void Method()
{
Foo foo = new Foo();
}
}
class Program
{
static void Main(string[] args)
{
new Foo();
}
}


Note: The rules changed since I posted this.

That is it:

class Foo
{
//static Foo foo = new Foo(); // you are not allowed using this approach
//static readonly Foo foo = new Foo(); // you are not allowed using this approach
Foo foo = null; // Removing code != modifying.
}
class Program
{
static void Main(string[] args)
{
new Foo();
}
}

• It is almost funny, just almost. :-) – kiss my armpit Jan 6 '14 at 2:13
• Your trivial code can actually be simplified as Foo foo; to make it almost funnier. – kiss my armpit Jan 6 '14 at 2:22
• @StiffJokes In this case, you could argue that I was deleting code, against the rules (as they were at that time). – Victor Stafusa Jan 6 '14 at 2:23
class Foo
{
//static Foo foo = new Foo(); // you are not allowed using this approach
//static readonly Foo foo = new Foo(); // you are not allowed using this approach
Foo foo = true?null: new Foo();
}
class Program
{
static void Main(string[] args)
{
new Foo();
}
}