Bir zürafa ne zaman bir zürafa değil?


23

Umarım bu tür "bilmece" Programming Puzzles & Code Golf programında ontopiktir.

Aşağıdaki C # yönteminin geri döndüğüfalse duruma bir örnek verin :

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

Kurallar: Yukarıdaki kod satırları hiçbir şekilde değiştirilmemelidir, ancak "proje" derlenecek ve yöntem çağrılacak şekilde kodu bir uygulamaya koyacaksınız. Çalıştırıldığında, yöntem geri dönmelidir false. Aklımdaki çözüm, çalışma zamanında veya benzer "egzotik" şeylerde kendi IL'sini yaymıyor, sıradan bir örnek yöntem çağrısı.


2
"Yöntem denir" derken, bir şekilde gerçekleşmesi Giraffe giraffe = new Giraffe(); giraffe.Test(); gerektiğini söylemek istiyorsun, öyle ki, bu yöntemdeki satır, aslında, yürütülür mü?
Jesse C. Dilimleyici

@ JesseC.Slicer Evet, aklımdaki çözüme göre bu çizgi ortaya çıkıyor. Tabii ki benim de düşünmediğim başka çözümleri de görmek ilginç olabilir. Öyleyse eğer bir şey varsa, gönder!
Jeppe Stig Nielsen

1
Benim basit çözümüm daha çok benziyor Animal giraffe = new Giraffe(); giraffe.Test();ve ana sınıf geri dönen Animalbir Test()metoda sahip false. Bu, Giraffe's' den ziyade ebeveyn sınıf yöntemini çağırdığı için biraz hile yapmak . Ancak çağrı sitesi aynı görünüyor.
Jesse C. Dilimleyici

@ JesseC.Slicer Ah, anlıyorum. Sizin “çözümünüz” ile geri dönenlerin “aşağıdaki yöntem” (sorunumda yazdığı gibi) olmadığını falseve bu yüzden bunun tam bir çözüm olduğunu söyleyemeyeceğimi iddia ediyorum. Ama yine de ilginç. Benim çözümümün hiçbir yöntemi gizleme (ipucu) yoktur, ancak dediğim gibi, diğer çözümler de ilginç olabilir.
Jeppe Stig Nielsen

Yanıtlar:


28

Yay, buldum!

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

Bu yana Giraffe 1bir üyesidir Animalve Giraffe 2bir seviye daha dışarı, adı Giraffeiçinde istesti (Cı 5. spec bölüm 7.6.2) önceki belirtmektedir.

Visual Studio aşağıdakiler için bir uyarı gösterir this is Giraffe:

Verilen ifade hiçbir zaman sağlanan tipte değildir.

Bu kesinlikle doğru, çünkü asıl mesele bu :)

Giraffe 1Doğrudan içine koyamazsınız Giraffe 2çünkü

üye adları, ek türleriyle aynı olamaz

- ama türetilmiş sınıflar için böyle bir kural yoktur.

Düzgün bir sorun, biraz zaman aldı.


11
İyi oynadı efendim
Marc Gravell

2
Evet, aklımdaki çözüm buydu! Bu nedenle, biri TheNamespace.Animal.Giraffemiras nedeniyle aynı zamanda çağrılabilir TheNamespace.Giraffe.Giraffe, biri de yuvalanmamış olan iki tür vardır TheNamespace.Giraffe. C # özelliklerine referansınız ilgili! Derleyici uyarısından kurtulabilirsiniz. Temel sınıfın iç içe tipini 'dan' a classdeğiştirin interface. Bu durumda birisi iç içe geçmemiş durumdan daha fazla türetebilir Giraffe ve iç içe geçmeyi Giraffede uygulayabilir, bu durumda derleyici şikayet edemez; Bu bir "adil" tip kontrolü.
Jeppe Stig Nielsen

1
Bu çözümü anlamıyorum - bunun sebebi C # hakkında fazla şey bilmemem olabilir. Bu isimleri oynamaktan hoşlanmıyorum. @ JesseC.Slicer'in çözümünü daha akıllıca buluyorum.
Nicolas Barbulesco,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.