C# 收藏<;T>;不包含ICollection接口的所有属性

C# 收藏<;T>;不包含ICollection接口的所有属性,c#,.net,inheritance,interface,C#,.net,Inheritance,Interface,Collection类实现了多个接口,其中一个接口是ICollection。ICollection接口有两个属性未在Collection中实现 在C#中,我认为必须在继承接口的类中实现接口的所有方法和属性。那么,如何允许Collection类摆脱它呢?它的叔叔为框架工作,而每个人的看法都是相反的 将集合转换为ICollection,您将看到它实现了ICollection的整个接口,此接口被称为。除非将对象引用转换为接口类型,否则可以使成员从外部不可见 在Collection实现ICollecti

Collection
类实现了多个接口,其中一个接口是
ICollection
ICollection
接口有两个属性未在
Collection
中实现


在C#中,我认为必须在继承接口的类中实现接口的所有方法和属性。那么,如何允许
Collection
类摆脱它呢?

它的叔叔为框架工作,而每个人的看法都是相反的

集合
转换为
ICollection
,您将看到它实现了
ICollection

的整个接口,此接口被称为。除非将对象引用转换为接口类型,否则可以使成员从外部不可见

Collection
实现
ICollection
的上下文中,所讨论的接口定义了将泛型引入C#之前存在的遗留方法。你可以说这是一种管理收藏的“丑陋的老办法”

实现者决定隐藏这些丑陋的方法,同时仍然向调用者提供其功能

var x = new Collection<int>();
object syncRoot = x.SyncRoot; //CS1061: Collection<int> does not contain a ....
ICollection collection = x;
syncRoot = collection.SyncRoot; //ok
这可以通过明确实施该方法来克服:

class Customer : IFile, IDatabaseRecord
{
    void IFile.Save() { }
    void IDatabaseRecord.Save() { }
}

请注意,这几乎总是一种代码气味——它可能会让调用者误以为某个方法不存在,或者调用错误的实现(这就导致这个问题首先被发布)

阅读您的评论后,问题是这些属性被显式实现,您可以注意到:

请注意,它不是一个公共属性,例如:

public bool IsSynchronized 
{
  get { return false; }
}
这基本上意味着该属性存在,但仅当您将其转换为
ICollection

var c = new Collection<double>();
var casted = (ICollection) c;
var isSync = casted.IsSynchronized;
var c=新集合();
var casted=(i集合)c;
var isSync=已同步铸造;

Google Explicit Interface Member Implementation为什么说属性没有实现?我在那里看到它们ICollection请求的属性是Count、SyncRoot和IsSynchronized,它们都包括在内。您认为哪两个属性没有实现?仅供参考。接口强制实现,但不强制访问级别。许多MS库实现了具有
内部访问权限的接口modifiers@MDK.  你能举个具体的例子吗?如果一个类实现了一个公共接口,那么与该接口相关的所有方法都必须是公共的。你说的“它的叔叔为框架工作,每个人看起来都是相反的”是什么意思?我相信裙带关系会有更好的理由。和阶级区分。感谢您解释它,以及它的用途。最后一件事,虽然我不知道有什么用处,但我们可以创建一个接口,然后以类似的方式隐藏一些属性或方法。接口没有访问修饰符,基本上就是这样。所以不可能隐藏members@Abhi.Net,我认为它们其实并不是隐藏的。如果有一个方法接受上述场景中的
IFile
,并将
Customer
的实例传递给它,则
IFile
类型的参数将有一个
Save()
方法。如果我没有错的话,它还会调用
IFile.Save()
。最后一件事是,你知道为什么在Visual Studio中我会看到集合:IList,ICollection,IEnumerable,IList,ICollection,IEnumerable,其中链接集合:IList,IList,IReadOnlyList@Abhi.Net玩我给你的游戏,使用搜索框,点击任何类型或界面,你想看到它的定义,它帮助我很多
public bool IsSynchronized 
{
  get { return false; }
}
var c = new Collection<double>();
var casted = (ICollection) c;
var isSync = casted.IsSynchronized;