Я надеюсь, что эта "загадка" является онтопом в Программировании Пазлов и Code Golf.
Приведите пример ситуации, когда метод C # ниже возвращаетfalse
:
public class Giraffe : Animal
{
public bool Test()
{
return this is Giraffe;
}
}
Правила: приведенные выше строки кода не должны быть изменены каким-либо образом, но вы должны поместить код в приложение, чтобы «проект» компилировался и вызывался метод. При запуске метод должен вернуться false
. Решение, которое я имею в виду, не генерирует свой собственный IL во время выполнения или подобные "экзотические" вещи, это обычный вызов метода экземпляра.
c#
programming-puzzle
Джепп Стиг Нильсен
источник
источник
Giraffe giraffe = new Giraffe(); giraffe.Test();
должно произойти как-то так, чтобы строка в этом методе фактически выполнялась?Animal giraffe = new Giraffe(); giraffe.Test();
и у родительского классаAnimal
естьTest()
метод, который возвращаетfalse
. Это немного обманывает, поскольку вызывает метод родительского класса, а неGiraffe
's'. Но сайт вызова выглядит так же.false
, поэтому я бы не сказал, что это было полное решение. Но все же интересно. Мое решение не имеет метода скрытия (подсказка), но, как я уже сказал, другие решения также могут быть интересны.Ответы:
Yay, нашел это!
Поскольку он
Giraffe 1
является членомAnimal
иGiraffe 2
находится на один уровень дальше, имяGiraffe
вis
тесте относится к первому (раздел 7.6.2 в спецификации C # 5).Visual Studio показывает предупреждение для
this is Giraffe
:что, очевидно, верно, так как в этом весь смысл :)
Вы не можете положить
Giraffe 1
прямо внутрьGiraffe 2
, потому что- но такого правила не существует для производных классов.
Аккуратная проблема, заняла у меня некоторое время.
источник
TheNamespace.Animal.Giraffe
который также может быть вызван из-за наследованияTheNamespace.Giraffe.Giraffe
, а другой - не вложенныйTheNamespace.Giraffe
. Ваша ссылка на спецификацию C # актуальна! Вы можете избавиться от предупреждения компилятора. Просто измените вложенный тип базового класса сclass
наinterface
. В этом случае кто-то может получить дальнейшее развитие от не вложенногоGiraffe
и реализовать также вложенноеGiraffe
, поэтому в этом случае компилятор не может пожаловаться; это «честная» проверка типов.