将值分配给readonly属性使用固定值但不使用变量

时间:2017-03-30 15:15:38

标签: c# entity-framework

使用Entity Framework创建索引并具有以下代码:

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 documentation,这似乎是正确的,Columns属性没有设置器。但是,如果是这种情况,为什么第一个代码块不会抛出编译器错误,但是第二个代码会在我尝试从变量设置此值的地方呢?

1 个答案:

答案 0 :(得分:2)

这是因为当您使用第一个代码时使用collection-initializer,第二个示例使用经典的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";