Quando una giraffa non è una giraffa?


23

Spero che questo tipo di "indovinello" sia ontopico in Programming Puzzles & Code Golf.

Fornisci un esempio di una situazione in cui viene restituito ilfalse metodo C # riportato di seguito :

public class Giraffe : Animal
{
  public bool Test()
  {
    return this is Giraffe;
  }
}

Regole: Le righe di codice sopra non devono essere modificate in alcun modo, ma si inserirà il codice in un'applicazione in modo che il "progetto" si compili e venga chiamato il metodo. Quando eseguito, il metodo deve restituire false. La soluzione che ho in mente, non emette il proprio IL in fase di esecuzione o cose "esotiche" simili, è una normale chiamata di metodo di istanza.


2
Con "il metodo si chiama", vuoi dire che Giraffe giraffe = new Giraffe(); giraffe.Test(); deve avvenire in qualche modo in modo che la linea in quel metodo venga, di fatto, eseguita?
Jesse C. Slicer,

@ JesseC.Slicer Sì, nella soluzione che ho in mente, si verifica quella linea. Certo, potrebbe essere interessante vedere anche altre soluzioni a cui non ho pensato. Quindi se hai qualcosa, pubblicalo!
Jeppe Stig Nielsen,

1
Bene, la mia soluzione semplice sembra più simile Animal giraffe = new Giraffe(); giraffe.Test();e la classe genitore Animalha un Test()metodo che ritorna false. Questo è un po 'barare perché chiama il metodo della classe genitore piuttosto che Giraffe' s. Ma il sito della chiamata ha lo stesso aspetto.
Jesse C. Slicer,

@ JesseC.Slicer Ah, capisco. Direi che con la tua "soluzione" non è il "metodo di seguito" (come dice il mio problema) che ritorna false, quindi non direi che era una soluzione completa. Ma interessante ancora. La mia soluzione non ha alcun metodo nascosto (suggerimento), ma come ho già detto, anche altre soluzioni potrebbero essere interessanti.
Jeppe Stig Nielsen,

Risposte:


28

Yay, l'ho trovato!

public class Animal
{
    public class Giraffe { } // 1
}
public class Giraffe : Animal // 2
{
    public bool Test()
    {
        return this is Giraffe;
    }
}

Poiché Giraffe 1è membro di Animal, ed Giraffe 2è un livello più avanti, il nome Giraffenel istest si riferisce al primo (sezione 7.6.2 nelle specifiche C # 5).

Visual Studio mostra un avviso per this is Giraffe:

L'espressione data non è mai del tipo fornito

che è ovviamente vero, dal momento che è l'intero punto :)

Non puoi metterlo Giraffe 1direttamente dentro Giraffe 2, perché

i nomi dei membri non possono coincidere con il loro tipo allegato

- ma tale regola non esiste per le classi derivate.

Bel problema, mi ci è voluto un po '.


11
Ben giocato signore
Marc Gravell

2
Sì, questa era la soluzione che avevo in mente! Quindi ci sono due tipi, uno nidificato TheNamespace.Animal.Giraffeche a causa dell'eredità può anche essere chiamato TheNamespace.Giraffe.Giraffee uno non nidificato TheNamespace.Giraffe. Il tuo riferimento alle specifiche C # è rilevante! È possibile eliminare l'avviso del compilatore. Basta cambiare il tipo nidificato della classe base da classa interface. In tal caso qualcuno potrebbe derivare ulteriormente dal non nidificato Giraffe e implementare anche il nidificato Giraffe, quindi in quel caso il compilatore non può lamentarsi; è un controllo del tipo "equo".
Jeppe Stig Nielsen,

1
Non capisco questa soluzione, forse perché non conosco molto C #. Non mi piace giocare con i nomi. Trovo la soluzione di @ JesseC.Slicer molto più intelligente.
Nicolas Barbulesco,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.