当前位置: 首页 > 知识库问答 >
问题:

在C#中,括号内表达式的赋值是什么意思?

盛承
2023-03-14

我正在阅读Avalonia的源代码,我遇到了这样一句话:

return new MenuFlyoutPresenter
{
    [!ItemsControl.ItemsProperty] = this[!ItemsProperty],
    [!ItemsControl.ItemTemplateProperty] = this[!ItemTemplateProperty]
};

我从没见过这样的语法。如果没有索引属性或这个[]访问器,这些括号会做什么?,如果他们所指的财产不是布尔,为什么要用感叹号来否定呢?,也许是某种空检查?

代码本身包含在以下cs文件中:

https://github.com/AvaloniaUI/Avalonia/blob/master/src/Avalonia.Controls/Flyouts/MenuFlyout.cs

我跟踪了代码,但无法理解该语法的作用。

共有2个答案

丰辰沛
2023-03-14

一个相对简单的类演示了一种允许这种语法的方法:

public sealed class Demo
{
    public Demo this[Demo index] // Indexer
    {
        get => !index;
        set {} // Not needed to demonstrate syntax. 
    }

    public static Demo operator !(Demo item) => item;

    public Demo ItemsProperty        => _empty;
    public Demo ItemTemplateProperty => _empty;

    public Demo SomeMethod(Demo ItemsControl)
    {
        return new Demo
        {
            [!ItemsControl.ItemsProperty] = this[!ItemsProperty],
            [!ItemsControl.ItemTemplateProperty] = this[!ItemTemplateProperty],
        };
    }

    static Demo _empty = new();
}

需要注意的是:

  • Demoimplementsoperator 允许 运算符用于该类型的值(例如SomeMethod()初始化中的!ItemsProperty

它是操作符()的组合运算符以及启用语法的这个[Demo]索引器。

廉子民
2023-03-14

这里发生了一些事情。

一、语法:

var menu = new MenuFlyoutPresenter
{
    [key] = value,
};

集合初始值设定项,是以下内容的缩写:

var menu = new MenuFlyoutPresenter();
menu[key] = value;

该索引器定义如下:

public IBinding this[IndexerDescriptor binding]
{
    get { return new IndexerBinding(this, binding.Property!, binding.Mode); }
    set { this.Bind(binding.Property!, value); }
}

因此,有一个索引描述符是一个索引

这是怎么回事?

!ItemsControl.ItemsProperty

我们可以从您的链接中看到,ItemsProperty是一个DirectProperty

public static IndexerDescriptor operator !(AvaloniaProperty property)
{
    return new IndexerDescriptor
    {
        Priority = BindingPriority.LocalValue,
        Property = property,
    };
}

Avalonia似乎喜欢重载运算符,如~来做你可能没有想到的事情(通常会使用for的方法)。在这种情况下,他们使用!AvaloniaProperty上的作为访问该属性绑定的简写。

 类似资料:
  • 问题内容: Java表达式中的双引号是什么意思? 我有: 有人可以解释这些表达式的计算方式,最后一个的目的是什么? 问题答案: 里面的任何东西都会变成。和+ =。例如 你会得到 在你的问题上 将被评估为:

  • 问题内容: 我正在用Java编写程序以接受查询。如果我有类似的查询 …我可以使用什么正则表达式将其转换为: …要么: 实际上,我想知道如何编写正则表达式以仅删除方括号内的空格。 问题答案: 假设括号正确平衡且没有嵌套括号,则以下内容将删除括号内(且仅在括号内)的所有空格: 它转变 进入 说明:

  • 问题内容: 我在jQuery文件中找到了这个: 花括号做什么? 问题答案: 在您的情况下,这是一个传递给CSS函数的对象。 在这里你也可以使用 这是物体的另一个例子

  • 问题内容: 我对以下python表达式很感兴趣: 任务是将2个字典合并为第三个字典,以上表达式可以很好地完成任务。我对运算符及其对表达式的作用很感兴趣。我以为是幂运算符,并且尚未在上面的上下文中看到它。 完整的代码段是这样的: 问题答案: 参数列表中的in有特殊含义,如本教程的4.7节所述。随其传递的字典(或类似字典的)对象被扩展为可调用对象的关键字参数,就像被扩展为单独的位置参数一样。

  • 和?我试着在谷歌上搜索,但没有成功。

  • PEP 572引入了为Python 3.8实现的赋值表达式(俗称Walrus操作符)。这似乎是一个非常重要的新特性,因为它将允许在理解和lambda函数中进行这种形式的赋值。 赋值表达式的语法、语义学和语法规范到底是什么? 为什么在PEP 379中关于“添加赋值表达式”的类似想法之前遭到拒绝的情况下,引入了这个新的(似乎相当激进的概念)?