기린은 언제 기린이 아닌가?


23

이런 종류의 "수수께끼"가 Programming Puzzles & Code Golf에서 주제가되기를 바랍니다.

아래 C # 메소드가 리턴false 하는 상황의 예를 제공하십시오 .

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

규칙 : 위의 코드 줄은 어떤 식 으로든 변경해서는 안되지만 "프로젝트"가 컴파일되고 메서드가 호출되도록 코드를 응용 프로그램에 넣습니다. 실행될 때 메소드는를 리턴해야합니다 false. 내가 생각한 솔루션은 런타임이나 유사한 "이국적인"것에서 자체 IL을 방출하지 않으며 일반적인 인스턴스 메소드 호출입니다.


2
"메소드가 호출된다"는 말 은, 그 메소드의 라인이 실제로 실행되도록 어떻게 든 발생 Giraffe giraffe = new Giraffe(); giraffe.Test(); 해야 한다는 것을 의미 합니까?
제시 C. 슬라이서

@ JesseC.Slicer 예, 내가 생각한 솔루션에서 그 선이 발생합니다. 물론 내가 생각하지 않은 다른 솔루션을 보는 것이 흥미로울 수 있습니다. 따라서 무언가가 있다면 게시하십시오!
Jeppe Stig Nielsen

1
글쎄, 내 간단한 솔루션은 더 비슷해 보이고 Animal giraffe = new Giraffe(); giraffe.Test();부모 클래스 Animal에는 Test()을 반환 하는 메서드가 false있습니다. 의 클래스가 아닌 부모 클래스 메서드를 호출 할 때 약간의 부정 행위 Giraffe입니다. 그러나 호출 사이트는 동일하게 보입니다.
제시 C. 슬라이서

@ JesseC.Slicer 아, 알겠습니다. 나는 당신의 "솔루션"을 사용하는 것이 (아래 문제의 방법이 아니라) (내 문제에서 말한 것처럼) 반환 false하지 않는다고 주장하므로 완전한 솔루션이라고는 말할 수 없습니다. 그러나 여전히 흥미 롭습니다. 내 솔루션에는 메소드 숨기기 (힌트)가 없지만 내가 말했듯이 다른 솔루션도 흥미로울 수 있습니다.
Jeppe Stig Nielsen

답변:


28

예, 찾았어요!

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

이후 Giraffe 1의 구성원 Animal, 및 Giraffe 2한 단계 더 밖으로 이름 Giraffe에서 is테스트합니다 (C # 5 스펙 섹션 7.6.2) 구를 지칭한다.

Visual Studio는 다음에 대한 경고를 표시합니다 this is Giraffe.

주어진 표현은 제공된 유형이 아닙니다

그것은 요점이기 때문에 분명히 사실입니다 :)

당신은 넣을 수 없습니다 Giraffe 1내부에 직접 Giraffe 2있기 때문에,

멤버 이름은 둘러싸는 유형과 같을 수 없습니다

– 파생 클래스에는 이러한 규칙이 없습니다.

깔끔한 문제, 시간이 좀 걸렸습니다.


11
잘 연주했습니다
Marc Gravell

2
예, 이것이 내가 생각한 해결책이었습니다! 따라서 TheNamespace.Animal.Giraffe상속 때문에 상속 될 수있는 중첩 된 유형 TheNamespace.Giraffe.Giraffe과 중첩되지 않은 유형의 두 가지 유형이 있습니다 TheNamespace.Giraffe. C # 사양에 대한 참조는 관련이 있습니다! 컴파일러 경고를 제거 할 수 있습니다. 단지에서 기본 클래스의 중첩 유형을 변경 class하는 interface. 이 경우 누군가가 중첩되지 않은 곳에서 더 멀어지고 중첩 Giraffe 구현할 Giraffe수 있으므로 컴파일러는 불평 할 수 없습니다. "공정한"유형 검사입니다.
Jeppe Stig Nielsen

1
이 솔루션을 이해하지 못합니다. C #을 많이 모르기 때문일 수 있습니다. 나는 이름을 연주하는 것을 좋아하지 않습니다. @ JesseC.Slicer의 해결책이 훨씬 영리합니다.
Nicolas Barbulesco 13:30에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.