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
    
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. –  cyanide-based food 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
    
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
    
@Quincunx: I changed the tag. –  cyanide-based food Jan 10 at 3:58

9 Answers 9

up vote 7 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. –  cyanide-based food Jan 6 at 2:25
    
+1. Nice. Thanks. –  cyanide-based food 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. :-) –  cyanide-based food 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
    
It is really funny, really. –  cyanide-based food 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, ie that the rule applies to any use of an access modifier, or only if applied to foo. (Could someone who can compil 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
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

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
{
    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

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. :-) –  cyanide-based food Jan 6 at 2:13
    
Your trivial code can actually be simplified as Foo foo; to make it almost funnier. –  cyanide-based food 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

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

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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