J'espère que ce genre d'énigme est ontopique dans la programmation des puzzles et du code golf.
Donnez un exemple d'une situation où la méthode C # ci-dessous renvoiefalse
:
public class Giraffe : Animal
{
public bool Test()
{
return this is Giraffe;
}
}
Règles: Les lignes de code ci-dessus ne doivent en aucun cas être modifiées, mais vous mettriez le code dans une application pour que le «projet» se compile et que la méthode soit appelée. Lors de son exécution, la méthode doit revenir false
. La solution que j'ai en tête, n'émet pas son propre IL au moment de l'exécution ou des choses "exotiques" similaires, c'est un appel de méthode d'instance ordinaire.
c#
programming-puzzle
Jeppe Stig Nielsen
la source
la source
Giraffe giraffe = new Giraffe(); giraffe.Test();
doit se produire d'une manière ou d'une autre pour que la ligne de cette méthode soit, en fait, exécutée?Animal giraffe = new Giraffe(); giraffe.Test();
et la classe parenteAnimal
a uneTest()
méthode qui retournefalse
. Cela triche un peu car il appelle la méthode de la classe parent plutôt queGiraffe
la sienne. Mais le site d'appel se ressemble.false
, donc je ne dirais pas que c'était une solution complète. Mais intéressant quand même. Ma solution n'a pas de méthode de masquage (indice), mais comme je l'ai dit, d'autres solutions pourraient aussi être intéressantes.Réponses:
Ouais, je l'ai trouvé!
Étant donné qu'il
Giraffe 1
est membreAnimal
et seGiraffe 2
trouve un niveau plus loin, le nomGiraffe
dans leis
test fait référence au premier (section 7.6.2 dans la spécification C # 5).Visual Studio affiche un avertissement pour
this is Giraffe
:ce qui est évidemment vrai, puisque c'est tout l'intérêt :)
Vous ne pouvez pas mettre
Giraffe 1
directement à l'intérieurGiraffe 2
, car- mais une telle règle n'existe pas pour les classes dérivées.
Joli problème, ça m'a pris du temps.
la source
TheNamespace.Animal.Giraffe
qui, en raison de l'héritage, peut également être appeléTheNamespace.Giraffe.Giraffe
, et l'autre non imbriquéTheNamespace.Giraffe
. Votre référence à la spécification C # est pertinente! Vous pouvez vous débarrasser de l'avertissement du compilateur. Changez simplement le type imbriqué de la classe de base declass
eninterface
. Dans ce cas, quelqu'un pourrait dériver davantage du non-imbriquéGiraffe
et l' implémenterGiraffe
également, donc dans ce cas, le compilateur ne peut pas se plaindre; c'est une vérification de type «juste».