Espero que este tipo de "acertijo" sea un tema de programación en Puzzles y Code Golf.
Dé un ejemplo de una situación en la que el siguiente método de C # devuelvefalse
:
public class Giraffe : Animal
{
public bool Test()
{
return this is Giraffe;
}
}
Reglas: Las líneas de código anteriores no deben cambiarse de ninguna manera, pero debe colocar el código en una aplicación para que se compile el "proyecto" y se llame al método. Cuando se ejecuta, el método debe regresar false
. La solución que tengo en mente, no emite su propia IL en tiempo de ejecución o cosas "exóticas" similares, es una llamada de método de instancia ordinaria.
c#
programming-puzzle
Jeppe Stig Nielsen
fuente
fuente
Giraffe giraffe = new Giraffe(); giraffe.Test();
debe ocurrir de alguna manera para que la línea de ese método se ejecute?Animal giraffe = new Giraffe(); giraffe.Test();
y la clase padreAnimal
tiene unTest()
método que devuelvefalse
. Eso es un poco engañoso, ya que llama al método de la clase padre en lugar delGiraffe
's. Pero el sitio de la llamada se ve igual.false
, por lo que no diría que fue una solución completa. Pero interesante aún. Mi solución no tiene ningún método de ocultación (pista), pero como dije, otras soluciones también podrían ser interesantes.Respuestas:
Yay, lo encontré!
Como
Giraffe 1
es miembroAnimal
yGiraffe 2
está un nivel más allá, el nombreGiraffe
en lais
prueba se refiere al primero (sección 7.6.2 en la especificación C # 5).Visual Studio muestra una advertencia para
this is Giraffe
:lo cual es obviamente cierto, ya que es todo el punto :)
No se puede poner
Giraffe 1
directamente adentroGiraffe 2
, porque- pero dicha regla no existe para las clases derivadas.
Buen problema, me llevó un tiempo.
fuente
TheNamespace.Animal.Giraffe
que, por herencia, también se puede llamarTheNamespace.Giraffe.Giraffe
y otro no anidadoTheNamespace.Giraffe
. ¡Su referencia a la especificación de C # es relevante! Puede deshacerse de la advertencia del compilador. Simplemente cambie el tipo anidado de la clase base declass
ainterface
. En ese caso, alguien podría derivar más de lo no anidadoGiraffe
e implementarloGiraffe
también, por lo que en ese caso el compilador no puede quejarse; es un cheque de tipo "justo".