キリンがキリンではないのはいつですか?


23

この種の「なぞなぞ」がプログラミングパズルとコードゴルフで話題になっていることを願っています。

以下の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はい、私が念頭に置いているソリューションでは、その行は発生します。もちろん、私が考えもしなかった他のソリューションを見るのも面白いかもしれません。それで、もし何かがあれば、それを投稿してください!
ジェッペスティグニールセン

1
さて、私の単純な解決策はより似てAnimal giraffe = new Giraffe(); giraffe.Test();おり、親クラスにAnimalTest()を返すメソッドがありますfalse。それはGiraffe's ではなく親クラスメソッドを呼び出すため、少し不正です。しかし、通話サイトは同じように見えます。
ジェシーC.スライサー

@ JesseC.Slicerああ、なるほど。私はあなたの「解決策」では、「私の問題で言うように」「以下の方法」ではfalseなく、完全な解決策であるとは言いません。しかし、まだ興味深い。私のソリューションにはメソッドの非表示(ヒント)がありませんが、私が言ったように、他のソリューションも興味深い可能性があります。
ジェッペスティグニールセン

回答:


28

わかった!

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

はのGiraffe 1メンバーでありAnimalGiraffe 2さらに1レベル上Giraffeにあるため、isテスト内の名前は前者を指します(C#5仕様のセクション7.6.2)。

Visual Studioは次の警告を表示しthis is Giraffeます。

指定された式は提供されたタイプではありません

それは全体のポイントなので、明らかに真実です:)

あなたは置くことができないGiraffe 1内部に直接Giraffe 2ので、

メンバー名はそれを囲む型と同じにすることはできません

–しかし、そのようなルールは派生クラスには存在しません。

きちんとした問題、私はしばらくかかりました。


11
よく演奏されたサー
マークグラヴェル

2
はい、これは私が念頭に置いていた解決策でした!そのため、2つのタイプがあります。1つTheNamespace.Animal.Giraffeは、継承のために呼び出すこともできるTheNamespace.Giraffe.Giraffeネストされたものと 、ネストされていないもの TheNamespace.Giraffeです。C#仕様への参照は関連性があります!コンパイラの警告を取り除くことができます。基本クラスのネストされた型をからclassに変更するだけinterfaceです。その場合、誰かがネストされていないものからさらに派生し、ネストされたものGiraffe 実装するGiraffe可能性があります。その場合、コンパイラは文句を言うことができません。これは「公平な」タイプチェックです。
ジェッペスティグニールセン

1
私はこのソリューションを理解していません-それは、C#をあまり知らないためかもしれません。私はこれが名前で遊ぶのが好きではありません。@ JesseC.Slicerのソリューションはもっと賢いと思います。
ニコラスバルブレスコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.