Ich hoffe, diese Art von "Rätsel" ist in Programming Puzzles & Code Golf nicht mehr wegzudenken.
Geben Sie ein Beispiel für eine Situation, in der die folgende C # -Methode zurückgibtfalse
:
public class Giraffe : Animal
{
public bool Test()
{
return this is Giraffe;
}
}
Regeln: Die obigen Codezeilen dürfen in keiner Weise geändert werden, aber Sie würden den Code in eine Anwendung einfügen, sodass das "Projekt" kompiliert und die Methode aufgerufen wird. Beim Ausführen muss die Methode zurückgegeben werden false
. Die Lösung, die ich vor Augen habe, gibt zur Laufzeit keine eigene IL oder ähnliche "exotische" Dinge aus, es ist ein gewöhnlicher Instanzmethodenaufruf.
c#
programming-puzzle
Jeppe Stig Nielsen
quelle
quelle
Giraffe giraffe = new Giraffe(); giraffe.Test();
muss , damit die Zeile in dieser Methode tatsächlich ausgeführt wird?Animal giraffe = new Giraffe(); giraffe.Test();
und die ElternklasseAnimal
hat eineTest()
Methode, die zurückgibtfalse
. Das ist ein bisschen schummeln, da es eher die übergeordnete Klassenmethode alsGiraffe
's aufruft . Aber die Anrufseite sieht genauso aus.false
, also würde ich nicht sagen, dass es eine vollständige Lösung ist. Aber trotzdem interessant. Meine Lösung hat keine versteckte Methode (Hinweis), aber wie gesagt, andere Lösungen könnten auch interessant sein.Antworten:
Ja, gefunden!
Da
Giraffe 1
er Mitglied vonAnimal
undGiraffe 2
eine Stufe weiter entfernt ist, bezieht sich der NameGiraffe
imis
Test auf den ersteren (Abschnitt 7.6.2 in der C # 5-Spezifikation).Visual Studio zeigt eine Warnung für
this is Giraffe
:Das ist natürlich wahr, da es der springende Punkt ist :)
Sie können nicht
Giraffe 1
direkt hineinsteckenGiraffe 2
, weil- Für abgeleitete Klassen gibt es eine solche Regel jedoch nicht.
Ordentliches Problem, dauerte eine Weile.
quelle
TheNamespace.Animal.Giraffe
der aufgrund der Vererbung auch aufgerufen werden kannTheNamespace.Giraffe.Giraffe
, und einen nicht verschachteltenTheNamespace.Giraffe
. Ihr Verweis auf die C # -Spezifikation ist relevant!Sie können die Compiler-Warnung loswerden. Ändern Sie einfach den verschachtelten Typ der Basisklasse vonclass
ininterface
. In diesem Fall könnte jemand weiter von dem nicht verschachtelten ableitenGiraffe
und das verschachtelte ebenfalls implementierenGiraffe
, sodass sich der Compiler in diesem Fall nicht beschweren kann. Es ist ein "fairer" Typcheck.