Take the 2-minute tour ×
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

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?

share|improve this question

closed as off-topic by Timtech, Martin Büttner, Peter Taylor, hsl, ProgramFOX Dec 1 at 16:53

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Questions without an objective primary winning criterion are off-topic, as they make it impossible to indisputably decide which entry should win." – Timtech, Martin Büttner, Peter Taylor, hsl, ProgramFOX
If this question can be reworded to fit the rules in the help center, please edit the question.

    
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 at 1:51
    
I probably will add more rules if your ideas are too trivial. Sorry for this inconvenience. –  stalking is prohibited Jan 6 at 2:02
5  
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 at 2:10
1  
This is a popularity-contest yet the accepted answer has few votes. You should accept the highest-voted answer (see popularity-contest) –  Quincunx Jan 10 at 3:43
1  
@Quincunx: I changed the tag. –  stalking is prohibited Jan 10 at 3:58

10 Answers 10

up vote 8 down vote accepted

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();
    }
}
share|improve this answer
    
Well, the rules forbid "using attributes". –  Victor Jan 6 at 2:24
    
@Victor: The code above does not contain any attributes. –  stalking is prohibited Jan 6 at 2:25
    
+1. Nice. Thanks. –  stalking is prohibited Jan 6 at 2:28
    
@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 Jan 6 at 2:32
    
I changed the tag just for attracting more creative method. :-) –  stalking is prohibited Jan 6 at 2:36

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();
    }
}
share|improve this answer
1  
It is really funny, really. –  stalking is prohibited Jan 6 at 2:20
3  
That's what I was gonna do... –  boothby Jan 6 at 2:43

How about this?

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();
    }
}
share|improve this answer
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?)

share|improve this answer
1  
Works with and without public. You also could've tested this on an online compiler, e.g. ideone. –  Bob Jan 6 at 6:04

To simplify Florent's code:

class Foo
{
    Foo foo = new Foo();

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

}
share|improve this answer
    
Does this actually work? Won't Foo foo = new Foo(); be (recursively) evaluated before any constructor is executed? –  nitro2k01 Feb 18 at 9:35
    
@nitro2k01 No, it won't. The static ctor is executed before any instance member initialization. –  Andris Feb 18 at 10:07
class Foo
{
    Foo(bool recursion = false)
    {
        if (recursion)
            Foo foo = new Foo();
    }
}
class Program
{
    static void Main(string[] args)
    {
        new Foo();
    }
}
share|improve this answer
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();
    }
}
share|improve this answer
1  
I guess that stopping stack overflow from happening by making infinite loop prior to it counts. It doesn't appear to be disallowed. –  xfix Jan 10 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 at 13:30
1  
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 at 13:39
1  
@Mark - Hmmm, seems a little passive-aggressive... ;) I like it. –  simon Jan 13 at 22:38
    
@simon It's called c-SHARP, because its not for the soft-hearted :-P –  Mark Jan 14 at 6:39

The Answer is:

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();
        Console.ReadLine();
    }
}
share|improve this answer

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();
    }
}
share|improve this answer
    
It is almost funny, just almost. :-) –  stalking is prohibited Jan 6 at 2:13
    
Your trivial code can actually be simplified as Foo foo; to make it almost funnier. –  stalking is prohibited Jan 6 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 Jan 6 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();
    }
}
share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.