为什么属性只能包含C#中接口类型的setter?

Isk*_*yev 5 c# class

我想知道为什么在C#中不允许在类类型的自动生成属性中仅使用{set}属性,如:

class Person {
    public string Name { set; } // Compile-time error
}
Run Code Online (Sandbox Code Playgroud)

但是,在接口类型中允许:

interface IPerson {
    string Name {set;} //Allowed
}
Run Code Online (Sandbox Code Playgroud)

在这里读到类似的问题,这是非常罕见的做法 - 我理解,但我想知道为什么CLR甚至允许这样做?

Zei*_*kki 10

原因很简单.如果您正在使用自动实现的属性(生成隐藏的私有字段).那么为什么你需要设置一个你永远无法获得的值(并随后使用).

对于接口,您没有使用自动实现的属性,它只是一个契约,指定实现类应该具有一个名为Name应该实现Setter方法的字符串属性.所以,你可以这样做:

interface IPerson
{
    string Name { set; }
}

class Person : IPerson
{
    private string _name;
    public String Name
    {
        set { _name = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

总而言之,C#编译器试图阻止我们做一些没有任何意义的事情:为私有隐藏字段提供永远无法获取的自动设置方法.