Saya berharap "teka-teki" semacam ini ontopic di Programming Puzzles & Code Golf.
Berikan contoh situasi di mana metode C # di bawah ini kembalifalse
:
public class Giraffe : Animal
{
public bool Test()
{
return this is Giraffe;
}
}
Aturan: Baris kode di atas tidak boleh diubah dengan cara apa pun, tetapi Anda akan memasukkan kode ke dalam aplikasi sehingga "proyek" dikompilasi dan metode dipanggil. Saat dijalankan, metode harus kembali false
. Solusi yang ada dalam pikiran saya, tidak memancarkan IL sendiri pada saat run-time atau hal-hal "eksotis" serupa, itu adalah panggilan metode contoh biasa.
c#
programming-puzzle
Jeppe Stig Nielsen
sumber
sumber
Giraffe giraffe = new Giraffe(); giraffe.Test();
harus terjadi entah bagaimana sehingga garis dalam metode itu, pada kenyataannya, dieksekusi?Animal giraffe = new Giraffe(); giraffe.Test();
dan kelas indukAnimal
memilikiTest()
metode yang mengembalikanfalse
. Itu sedikit curang karena memanggil metode kelas induk daripada metodeGiraffe
. Tetapi situs panggilan terlihat sama.false
, jadi saya tidak akan mengatakan itu adalah solusi lengkap. Tapi tetap menarik. Solusi saya tidak memiliki metode penyembunyian (petunjuk), tetapi seperti yang saya katakan, solusi lain juga bisa menarik.Jawaban:
Yay, menemukannya!
Karena
Giraffe 1
merupakan anggotaAnimal
, danGiraffe 2
satu tingkat lebih jauh, namaGiraffe
dalamis
tes mengacu pada yang pertama (bagian 7.6.2 dalam spesifikasi C # 5).Visual Studio menunjukkan peringatan untuk
this is Giraffe
:yang jelas benar, karena itu intinya :)
Anda tidak dapat
Giraffe 1
langsung dimasukkan ke dalamGiraffe 2
, karena- tetapi aturan seperti itu tidak ada untuk kelas turunan.
Masalah rapi, butuh waktu sebentar.
sumber
TheNamespace.Animal.Giraffe
yang karena warisan juga bisa disebutTheNamespace.Giraffe.Giraffe
, dan satu non-bersarangTheNamespace.Giraffe
. Referensi Anda ke C # spec relevan! Anda bisa menyingkirkan peringatan kompiler. Cukup ganti tipe bersarang dari kelas dasar dariclass
menjadiinterface
. Dalam hal ini seseorang mungkin berasal lebih jauh dari non-bersarangGiraffe
dan mengimplementasikan bersarangGiraffe
juga, jadi dalam hal itu kompiler tidak dapat mengeluh; ini merupakan pemeriksaan tipe "adil".