在C#中(这个==NULL)是什么意思?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (118)

由于在C#4中修复了一个错误,所以下面返回true。(在LINQPad中试用)

void Main() { new Derived(); }

class Base {
    public Base(Func<string> valueMaker) { Console.WriteLine(valueMaker()); }
}
class Derived : Base {
    string CheckNull() { return "Am I null? " + (this == null); }
    public Derived() : base(() => CheckNull()) { }
}

在VS2008的Release模式下,它会抛出一个InvalidProgramException异常。(在调试模式下,它工作正常)

在VS2010 Beta 2中,它不能编译(我没有尝试Beta 1);

有没有其他的方式来实现this == null

提问于
用户回答回答于

根据规范(7.5.7节),你不应该能够在this上下文中访问,而在C#3.0编译器中这样做是一个错误。C#4.0编译器根据规范运行正常(即使在Beta 1中,这是一个编译时错误):

用户回答回答于

调试模式二进制的原始反编译(Reflector with no optimizations)为:

private class Derived : Program.Base
{
    // Methods
    public Derived()
    {
        base..ctor(new Func<string>(Program.Derived.<.ctor>b__0));
        return;
    }

    [CompilerGenerated]
    private static string <.ctor>b__0()
    {
        string CS$1$0000;
        CS$1$0000 = CS$1$0000.CheckNull();
    Label_0009:
        return CS$1$0000;
    }

    private string CheckNull()
    {
        string CS$1$0000;
        CS$1$0000 = "Am I null? " + ((bool) (this == null));
    Label_0017:
        return CS$1$0000;
    }
}

CompilerGenerated方法没有意义; 如果你看IL(下面),它将调用空字符串上的方法。

   .locals init (
        [0] string CS$1$0000)
    L_0000: ldloc.0 
    L_0001: call instance string CompilerBug.Program/Derived::CheckNull()
    L_0006: stloc.0 
    L_0007: br.s L_0009
    L_0009: ldloc.0 
    L_000a: ret 

在释放模式下,局部变量被优化掉了,所以它试图把一个不存在的变量推到堆栈上。

    L_0000: ldloc.0 
    L_0001: call instance string CompilerBug.Program/Derived::CheckNull()
    L_0006: ret 

扫码关注云+社区

领取腾讯云代金券