C#short null check语法

Sam*_*Sam 2 c# language-design

我最近在Objective C中编写了大量代码,同时还开展了几个C#项目.在这个过程中,我发现我错过了双向的事情.

特别是,当我在C#中编码时,我发现我错过了Objective C的短空检查语法.

为什么在C#中假设您无法使用以下语法检查对象是否为null:

if (maybeNullObject)  // works in Objective C, but not C#   :(
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

我同意这if (maybeNullObject != null)是一个更冗长/更清晰的语法,但是在代码中一直出来但过于冗长的感觉不仅乏味.另外,我相信if (maybeNullObject)大多数开发人员通常都会理解语法(Javascript,Obj C,我假设其他人).

我把它抛出作为一个问题,假设可能有一个特定的原因C#不允许if (maybeNullObject)语法.但我认为编译器可以轻松地将对象表达式(如if (maybeNullObject)自动(或自动))转换为if (maybeNullObject != null).

这个问题的一个很好的参考是一个想法如何成为一个C#语言功能?.

编辑

我建议的短空检查语法只适用于对象.短的空检查不适用于原语和类型bool?.

Ed *_* S. 9

因为ifC#中的语句是严格的.它们只取布尔值,没有别的,并且没有后续级别的"真实性"(即0,null,无论如何.它们是它们自己的动物,并且它们不存在隐式转换).

编译器可以"轻松地"将几乎任何表达式"转换"为布尔值,但这可能会导致细微的问题(相信我......)并且有意识地决定不允许这些隐式转换.

IMO这是一个不错的选择.您基本上要求一次性隐式转换,其中编译器假定,如果表达式未返回布尔结果,则程序员必须要执行空检查.除了是一个非常狭窄的特征,它纯粹是语法糖,提供很少甚至没有明显的好处.正如Eric Lippert woudl所说,每个功能都有成本......

您要求的功能会为语言增加不必要的复杂性(是的,它很复杂,因为类型可能会定义一个隐式转换为bool.如果是这种情况,执行哪个检查?)只允许您不键入!= null一次等一下.

编辑:

如何bool为@Sam 定义隐式转换的示例(对于注释来说太长).

class Foo
{
    public int SomeVar;
    public Foo( int i )
    {
        SomeVar = i;
    }

    public static implicit operator bool( Foo f )
    {
        return f.SomeVar != 0;
    }
}

static void Main()
{
    var f = new Foo(1);         
    if( f )
    {
        Console.Write( "It worked!" );
    }
}
Run Code Online (Sandbox Code Playgroud)