Mam nadzieję, że ten rodzaj „zagadki” jest ontopyczny w Programowaniu łamigłówek i Code Golf.
Podaj przykład sytuacji, w której poniższa metoda C # zwracafalse
:
public class Giraffe : Animal
{
public bool Test()
{
return this is Giraffe;
}
}
Reguły: Powyższe wiersze kodu nie mogą być w żaden sposób zmieniane, ale należy umieścić kod w aplikacji, aby kompilacja „projektu” i wywołanie metody Po uruchomieniu metoda musi zwrócić false
. Rozwiązanie, które mam na myśli, nie emituje własnej IL w czasie wykonywania ani podobnych „egzotycznych” rzeczy, jest to zwykłe wywołanie metody instancji.
c#
programming-puzzle
Jeppe Stig Nielsen
źródło
źródło
Giraffe giraffe = new Giraffe(); giraffe.Test();
musi się to zdarzyć, aby wiersz w tej metodzie został faktycznie wykonany?Animal giraffe = new Giraffe(); giraffe.Test();
a klasa nadrzędnaAnimal
maTest()
metodę, która zwracafalse
. To trochę oszukuje, ponieważ wywołuje metodę klasy nadrzędnej, a nie metodęGiraffe
. Ale strona połączeń wygląda tak samo.false
, więc nie powiedziałbym, że było to pełne rozwiązanie. Ale wciąż interesujące. Moje rozwiązanie nie ma żadnej metody ukrywania (podpowiedzi), ale jak powiedziałem, inne rozwiązania mogą być również interesujące.Odpowiedzi:
Tak, znalazłem to!
Ponieważ
Giraffe 1
jest członkiemAnimal
iGiraffe 2
jest o jeden poziom dalej, nazwaGiraffe
wis
teście odnosi się do pierwszej (sekcja 7.6.2 specyfikacji C # 5).Visual Studio wyświetla ostrzeżenie dla
this is Giraffe
:co jest oczywiście prawdą, ponieważ o to chodzi :)
Nie możesz umieścić
Giraffe 1
bezpośrednio w środkuGiraffe 2
, ponieważ- ale taka zasada nie istnieje dla klas pochodnych.
Niezły problem, zajęło mi to trochę czasu.
źródło
TheNamespace.Animal.Giraffe
który z powodu dziedziczenia można również wywołaćTheNamespace.Giraffe.Giraffe
, a drugi nie zagnieżdżonyTheNamespace.Giraffe
. Twoje odniesienie do specyfikacji C # jest istotne! Możesz pozbyć się ostrzeżenia kompilatora. Wystarczy zmienić zagnieżdżony typ klasy podstawowej zclass
nainterface
. W takim przypadku ktoś może czerpać dalej z nie zagnieżdżonegoGiraffe
i zaimplementować również zagnieżdżonyGiraffe
, więc w takim przypadku kompilator nie może narzekać; jest to „sprawiedliwy” typ kontroli.