C# 接口中未定义的属性的setter

C# 接口中未定义的属性的setter,c#,interface,C#,Interface,如果我的接口只有getter的签名,例如: public interface IInterface { object Id{get;} } 因此,接口仅在任何实现的类上指定Id的公共getter 现在当我上课时: public class Simple : IInterface { object Id { get{return something;} set{ do something else;} } } 编译器抱怨setter,因为接口中没有定义se

如果我的接口只有getter的签名,例如:

public interface IInterface 
{
   object Id{get;}
}
因此,接口仅在任何实现的类上指定Id的公共getter 现在当我上课时:

public class Simple : IInterface
{
  object Id
  {
    get{return something;} 
    set{ do something else;}
  }
}

编译器抱怨setter,因为接口中没有定义setter。然而,我没有为setter口述任何接口合同;为什么接口坚持在派生类上使用setter?

您只需要公开Id。例如,这可以很好地编译:

public interface IInterface
{
    object Id { get; }
}
public class Simple : IInterface
{
    private int something;
    public object Id
    {
        get { return something; }
        set{ something = (int)value;}
    }
}

在设计.net时,微软决定将属性分为三种不可互换的类型:只读、只读和读写。在C#中,如果声明的读写属性与一个或多个应该实现的接口属性同名,编译器不仅可以自动创建程序员实际指定的读写属性,还可以根据需要创建只读和/或只读属性以满足接口。例如,如果接口IReadableFoo实现只读属性Foo,IWritableFoo实现只读属性Foo,IReadWriteFoo继承IReadableFoo和IWriteFoo,并实现“新”读写属性Foo,类ReadWriteFoo实现IReadWriteFoo并声明公共读写属性Foo,编译器将使用ReadWriteFoo生成只读属性IReadableFoo.Foo、只读属性IWritableFoo.Foo的接口实现,和读写属性IReadWriteFoo.Foo。

实际的编译器错误是什么?从他的类中得到的编译器错误是Id无法实现接口,因为它是非公共的。当我将Id声明为显式声明时,我不能使用公共,你知道为什么吗?是的。显式声明是不同的-它们本质上是公共的,但仅当用作接口本身时(接口总是公共的)。但是,显式实现将不允许setter,因为接口(您将要使用的)在属性上只有一个getter。但是,再说一遍,为什么接口关心setter?我看到接口解释代码的方式是:只有一个getter,所以它应该是只读的;但你不能也解释为:我只在乎应该有一个获得者;这就是合同;我不关心setterIt不关心-但是如果您显式定义它,那么您定义的访问“仅用作接口”,而接口“显式”没有setter。在那里设置setter是没有意义的,因此编译器会抱怨。