将值分配给只读属性适用于固定值,但不适用于变量



使用实体框架创建索引并具有以下代码:

var op = new CreateIndexOperation
    {
        Columns = { "COL_A", "COL_B", "COL_C" },
        IsUnique = true,
        Name = "INDEX_NAME",
        Table = "TABLE_NAME"
    });

这将按预期编译和工作。 尝试将其重构为以下方法(针对此示例进行了简化(:

private void AddIndex(params string[] columns)
{
    var op = new CreateIndexOperation
    {
        Columns = columns.ToList(),
        IsUnique = true,
        Name = "INDEX_NAME",
        Table = "TABLE_NAME"
    });
}

此方法引发以下编译器错误:

Property or Indexer 'IndexOperation.Columns' cannot be assigned to -- it is read only

查看 MSDN 文档,这似乎是正确的,并且 Columns 属性没有资源库。 但是,如果是这种情况,为什么第一个代码块没有抛出编译器错误,而第二个代码块却在我尝试从变量设置此值的地方?

这是因为在使用第一个代码时,您使用的是集合初始值设定项,而第二个示例使用经典的 setter 方法(当然不存在(。这意味着在第一个示例中,您实际上是在调用类似的东西:

var op = new CreateIndexOperation();
op.Columns.Add(...);
op.IsUnique = true;
op.Name = "INDEX_NAME";
op.Table = "TABLE_NAME";

如您所见,您没有设置属性,而是在 getter 返回的对象上调用方法。

当然,这假设Columns是在类的构造函数中初始化的。否则你会得到一个NullReferenceException.

然而,第二个代码编译为:

var op = new CreateIndexOperation();
op.Columns = columns.ToList();
op.IsUnique = true;
op.Name = "INDEX_NAME";
op.Table = "TABLE_NAME";

最新更新