Web Log di Adrian Florea

"You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." Antoine de Saint-Exupery
posts - 440, comments - 950, trackbacks - 125

My Links

Archives

Post Categories

Image Galleries

.RO Blogs

.RO People

.RO Sites

Blogs

Furls

Links

vinCitori

Quiz Sharp #61 [quiz a quattro mani]

Di seguito un quiz a quattro mani con Matteo Spreafico, risultato di un bellissimo e lunghissimo chat:

Cosa stampa a video questo snippet?

struct Foo
{
    public static implicit operator bool(Foo value)
    {
        return value != null;
    }
}

class Test
{
    static void Main()
    {
        if (new Foo())
        {
            System.Console.WriteLine("Ciao");
        }
    }
}

  • 1. niente
  • 2. Ciao
  • 3. non compila
  • 4. runtime exception

Print | posted on venerdì 9 marzo 2007 18.51 | Filed Under [ Quiz Sharp ]

Feedback

Gravatar

# re: Quiz Sharp #61 [quiz a quattro mani]

Non compila perché Foo è una struct non nullable e non può essere confrontato con null.
09/03/2007 19.29 | Franco Denotti
Gravatar

# re: Quiz Sharp #61 [quiz a quattro mani]

Di compilare compila generando un *.exe e sconsigliandone l'esecuzione con un avvertimento a console:

warning CS0472: Il risultato dell'espressione è sempre
'true' perché un valore del tipo 'bool' non è mai uguale a 'null' del tipo 'bool?'.

Provando a lanciare l'exe generato, va in loop in corrispondenza di

return value != null;

/* viene saltato il passaggio del tipo bool, senza risolvere l'operazione al chiamante, ciò si trasforma in una funzione ricorsiva */

fino ad scatenare StackOverflowException

Quindi la risposta n° 4 è quella esatta.

09/03/2007 21.07 | Sem Tamburella
Gravatar

# re: Quiz Sharp #61 [quiz a quattro mani]

Ciao Sem,

e quale sarebbe la spiegazione di questa ricorsione?
09/03/2007 21.11 | Adrian Florea
Gravatar

# re: Quiz Sharp #61 [quiz a quattro mani]

in sostanza il runtime svolge "n" tentativi a ripetizione di valutare value di tipo Foo con null senza mai arrivare ad un risultato finale fino ad esaurire lo stack
09/03/2007 21.31 | Sem Tamburella
Gravatar

# re: Quiz Sharp #61 [quiz a quattro mani]

provare per credere

Ciao
09/03/2007 21.34 | Sem Tamburella
Gravatar

# re: Quiz Sharp #61 [quiz a quattro mani]

struct Foo
{
public static implicit operator bool(Foo value)
{
return value != new Foo();
}
}


class Test
{
static void Main()
{
bool b = (new Foo());
}
}

tra return value != new Foo();

stesso regalo: StackOverflowException
09/03/2007 22.03 | Sem Tamburella
Gravatar

# re: Quiz Sharp #61 [quiz a quattro mani]

così

struct Foo
{
public static implicit operator bool(Foo value)
{
Foo f;
return value != f;
}
}

e cosà

struct Foo
{
public static implicit operator bool(Foo value)
{
Foo f;
return value == f;
}
}

la musica è sempre StackOverflowException

The End :)
09/03/2007 22.12 | Sem Tamburella
Gravatar

# re: Quiz Sharp #61 [quiz a quattro mani]

sarà forse banale ma se proprio dovrebbe stampare "Ciao"

struct Foo
{
public static implicit operator bool(Foo value)
{
return !value.Equals(null);
}
}

senza complicarsi la vita ehehehe ;)
09/03/2007 22.39 | Sem Tamburella
Gravatar

# re: Quiz Sharp #61 [quiz a quattro mani]

La variabile value ed il valore null sono di tipi diversi, quando viene richiesto il confronto il compilatore cerca di far diventare compatibili.
Avendo definito una unica conversione implicita verrà eseguita quella andando a generare il loop.
Giusto?
10/03/2007 0.12 | Marco Mombelli
Gravatar

# re: Quiz Sharp #61 [quiz a quattro mani]

Anche con una variabile value confrontata con un'altra dello stesso tipo Foo, il comportamento e tale è quale a confronto con null. Loop infinito con conseguente errore di sistema.

using System;

struct Foo
{
static long i = 0;

public static implicit operator bool(Foo value)
{
try
{

Foo f = new Foo();

i++;

System.Console.Write("Loop: {0}{1}", i.ToString(), " | ");
System.Console.Write("value: {0}{1}" , value.ToString(), " | ");
System.Console.WriteLine("f: {0}", f.ToString());

return value != f;

}
catch (StackOverflowException ex)
{
System.Console.WriteLine("Message: {0}" + ex.Message);
System.Console.WriteLine("StackTrace: {0}", ex.StackTrace);
return true;
}
}
}

class Test
{
static void Main()
{
if (new Foo())
{
System.Console.WriteLine("Ciao");
}
}
}

10/03/2007 1.40 | Sem Tamburella
Gravatar

# Quiz Sharp #61 [la soluzione]

21/03/2007 17.36 | Web Log di Adrian Florea

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 4 and 6 and type the answer here:

Powered by: