什么时候长颈鹿不是长颈鹿?


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(); 必须以某种方式发生,以便实际上执行该方法中的行吗?
Jesse C. Slicer,

@ JesseC.Slicer是的,在我想到的解决方案中,确实出现了这一行。当然,看到我也没有想到的其他解决方案可能会很有趣。因此,如果您有东西,请张贴!
Jeppe Stig Nielsen

1
好吧,我的简单解决方案看起来更像Animal giraffe = new Giraffe(); giraffe.Test();,并且父类Animal有一个Test()return的方法false。这有点作弊,因为它调用了父类方法而不是Giraffe。但是呼叫站点看起来相同。
Jesse C. Slicer 2013年

@ JesseC.Slicer啊,我知道了。我认为使用您的“解决方案”并不是返回的“下面的方法”(正如我在问题中所说的)false,因此我不会说这是一个完整的解决方案。但是仍然很有趣。我的解决方案没有任何隐藏方法(提示),但是正如我所说,其他解决方案也可能很有趣。
2013年

Answers:


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,因此在这种情况下,编译器不会抱怨。这是一个“公平”的类型检查。
2013年

1
我不了解这种解决方案-可能是因为我不太了解C#。我不喜欢这样打名字。我发现@ JesseC.Slicer的解决方案更聪明。
Nicolas Barbulesco
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.