Espero que esse tipo de "enigma" seja onópico em Programação de quebra-cabeças e código de golfe.
Dê um exemplo de uma situação em que o método C # abaixo retornafalse
:
public class Giraffe : Animal
{
public bool Test()
{
return this is Giraffe;
}
}
Regras: As linhas de código acima não devem ser alteradas de forma alguma, mas você colocaria o código em um aplicativo para que o "projeto" seja compilado e o método seja chamado. Quando executado, o método deve retornar false
. A solução que tenho em mente, não emite sua própria IL em tempo de execução ou coisas "exóticas" semelhantes, é uma chamada de método de instância comum.
c#
programming-puzzle
Jeppe Stig Nielsen
fonte
fonte
Giraffe giraffe = new Giraffe(); giraffe.Test();
deve ocorrer de alguma forma, para que a linha desse método seja, de fato, executada?Animal giraffe = new Giraffe(); giraffe.Test();
e a classe paiAnimal
tem umTest()
método que retornafalse
. Isso está enganando um pouco, pois chama o método de classe pai, e não o métodoGiraffe
. Mas o site de chamada parece o mesmo.false
, então não diria que era uma solução completa. Mas ainda interessante. Minha solução não tem nenhum método oculto (dica), mas como eu disse, outras soluções também podem ser interessantes.Respostas:
Yay, encontrei!
Como
Giraffe 1
é membroAnimal
eGiraffe 2
está um nível mais adiante, o nomeGiraffe
nois
teste refere-se ao primeiro (seção 7.6.2 na especificação C # 5).Visual Studio mostra um aviso para
this is Giraffe
:o que é obviamente verdade, já que é o ponto principal :)
Você não pode colocar
Giraffe 1
diretamente dentroGiraffe 2
, porque- mas essa regra não existe para classes derivadas.
Belo problema, demorei um pouco.
fonte
TheNamespace.Animal.Giraffe
que também pode ser chamado por causa da herançaTheNamespace.Giraffe.Giraffe
e um não aninhadoTheNamespace.Giraffe
. Sua referência à especificação C # é relevante! Você pode se livrar do aviso do compilador. Apenas altere o tipo aninhado da classe base declass
parainterface
. Nesse caso, alguém pode derivar ainda mais do não aninhadoGiraffe
e implementar o aninhadoGiraffe
também; nesse caso, o compilador não pode reclamar; é uma verificação do tipo "justo".