0

我有这个属性

    /// <summary>
    /// The production date of the device is contained in its serial number.
    /// </summary>
    public DateTime Date
    {
        get 
        {
            return SerialNumber.Date;
        }
    }

但是,我希望我可以这样写

    /// <summary>
    /// The production date of the device is contained in its serial number.
    /// </summary>
    public DateTime Date
    {
        get return SerialNumber.Date;
    }

但我收到错误{ or ; expected

现在我的问题是:为什么我需要大括号,而我不想标记范围的开始和结束,因为只有一行代码。

我确实需要使用大括号并不重要。但在我看来,它与 C# 代码的其他解释不一致。

if(DoNotUseBraces) return null;例如,您可以使用 不需要大括号。甚至

if (SomeBoolean)
    return null;

同样,不需要大括号。我猜它与:为什么只有一个语句的方法需要大括号?但是 get 并没有像get()例如那样实现 ()

4

3 回答 3

3

因为 C# 中的属性也可以有一个 setter:

public DateTime Date
{
    get return SerialNumber.Date;
    set SerialNumber.Date = value;
}

那是行不通的。getter 在哪里结束,而 setter 从哪里开始?

即使您添加多行,这些范围也很清楚:

public DateTime Date
{
    get { return SerialNumber.Date; }
    set { SerialNumber.Date = value; }
}

现在我的问题是:为什么我需要大括号,而我不想标记范围的开始和结束,因为只有一行代码。

我认为对于 C# 编译器团队来说,要实现一些对于单行属性来说只是一个不错的东西的工作量太大了。

于 2013-06-12T09:46:51.597 回答
3

这些括号不适用于范围块,它是语法的一部分。setter 和 getter 实际上是方法,因此它类似于函数的语法。

对于if语句,括号不是语法的一部分:

if (<condition>) <statement>

对于属性 getter,方括号是语法的一部分:

<type> <identifier> { get { <statements> } }

就像它们用于函数一样:

<type> <identifier>(<parameters>) { <statements> }
于 2013-06-12T09:52:39.883 回答
1

它只是一种语言设计,是这样考虑的。这就像关于兰博基尼汽车的门是向上打开而不是像其他汽车那样侧向打开的事实。这都是关于语言设计的。

有关此问题的完整 Jon Skeet 答案,指向描述此问题的语言规范的确切位置,可以查看:

为什么这个编译错误

于 2013-06-12T09:46:28.423 回答