Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现接口_C#_.net_Inheritance_Interface - Fatal编程技术网

C# 实现接口

C# 实现接口,c#,.net,inheritance,interface,C#,.net,Inheritance,Interface,我对接口的实现感到困惑 根据ICollection具有属性IsReadOnly -及- 根据收集实现i收集 -所以- 我以为Collection将具有IsReadOnly属性 -然而- Collection<string> testCollection = new Collection<string>(); Console.WriteLine(testCollection.IsReadOnly); Collection testCollection=new Collec

我对接口的实现感到困惑

根据
ICollection
具有属性
IsReadOnly

-及-

根据
收集
实现
i收集

-所以-

我以为
Collection
将具有
IsReadOnly
属性

-然而-

Collection<string> testCollection = new Collection<string>();
Console.WriteLine(testCollection.IsReadOnly);
Collection testCollection=new Collection();
Console.WriteLine(testCollection.IsReadOnly);
上面的代码给出了编译器错误:

“System.Collections.ObjectModel.Collection”不包含“IsReadOnly”的定义,并且没有接受类型为的第一个参数的扩展方法“IsReadOnly”

可以找到“System.Collections.ObjectModel.Collection”(您是否缺少using指令或程序集引用?

-当-

Collection<string> testInterface = new Collection<string>();
Console.WriteLine(((ICollection<string>)testInterface).IsReadOnly);
Collection testInterface=new Collection();
Console.WriteLine(((ICollection)testInterface.IsReadOnly);
上述代码有效

-问题:-


我认为实现接口的类必须实现每个属性,所以为什么
testCollection
没有
IsReadOnly
属性,除非您将其转换为
ICollection

它可能显式地实现了该属性


C#使您能够将方法定义为“显式实现的接口方法/属性”,仅当您有确切接口的引用时才可见。这使您能够提供一个“更干净”的API,而不会产生太多噪音。

接口可以通过两种方式实现。显式和隐式

显式实现:当成员显式实现时,不能通过类实例访问它,只能通过接口实例访问它

隐式实现:可以通过接口方法和属性访问这些方法和属性,就像它们是类的一部分一样

IsReadonly
属性是显式实现的,因此它不能通过类直接访问。看一看

例如:

public interface ITest
{
    void SomeMethod();
    void SomeMethod2();
}

public ITest : ITest
{

    void ITest.SomeMethod() {} //explicit implentation
    public void SomeMethod2(){} //implicity implementation
}

请参阅以获得更好的解释谢谢提供信息。在搜索了这个之后,我在@jemartin80上找到了一个非常详尽的解释,很高兴它有所帮助。我想找出Eric Lippert对此的详细描述。但是我找不到它。