C# 了解ICollection实现和接口

C# 了解ICollection实现和接口,c#,C#,我熟悉这样一个事实:接口只包含方法、委托或事件的签名。方法的实现在实现接口的类中完成。实现接口的类必须实现其方法 我创建了一个通用列表。当我浏览列表的声明时,我看到它继承了ICollection,ICollection有一个签名方法:object SyncRoot{get;} 为什么我在List类中看不到SyncRoot实现 public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>

我熟悉这样一个事实:接口只包含方法、委托或事件的签名。方法的实现在实现接口的类中完成。实现接口的类必须实现其方法

我创建了一个通用列表。当我浏览列表的声明时,我看到它继承了ICollection,ICollection有一个签名方法:object SyncRoot{get;} 为什么我在List类中看不到SyncRoot实现

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>,
                       IList, ICollection, IEnumerable
{
    public List();
    public List(IEnumerable<T> collection);
    public List(int capacity);
}
公共类列表:IList、ICollection、IEnumerable、,
IList,ICollection,IEnumerable
{
公共列表();
公共列表(IEnumerable集合);
公共列表(国际容量);
}

我希望在上面看到:
public object syncRoot()
?另外,如果我用JustDecompile(Telerik)打开它,我会看到它是以
private
的形式实现的。我遗漏了什么吗?

正如@dtb所指出的,这是一个显式的接口实现。这意味着如果从类型为
ICollection
的引用中使用成员
SyncRoot
,而不是从类型为
List

var l = new List<int>();

// compiler error
var sr1 = l.SyncRoot;

ICollection c = l;

// works
var sr2 = c.SyncRoot;
因此,这为
ICollection
接口实现了
SyncRoot
,通过对
List
对象的任何
ICollection
引用使其可见,但对
List
对象的任何其他(非
ICollection
)引用将其隐藏

这在处理诸如
IEnumerable
之类的遗留接口时也非常有用。例如,如果要支持
IEnumerable
,还必须支持
IEnumerable
,但它们都有
GetEnumerator()
方法,这些方法的返回类型不同。例如:

public class MySpecialList<T> : IEnumerable<T>
{
    // if we access from any other reference, we get the new, generic
    // interface
    public IEnumerator<T> GetEnumerator()
    {
        // your actual implementation
    }

    // so if we access from a reference of IEnumerable, we get older,
    // non-generic interface
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

鲨鱼,你什么意思?0%意味着什么?在问了10个问题后,0%的接受率是非常糟糕的。请重新访问您以前的一些问题,并单击您认为合适、写得好或有帮助的答案旁边的“勾号”。“我熟悉界面只包含方法签名这一事实”,这是不正确的。它包含方法声明(返回类型和属性)。我知道,我的问题是为什么我不在列表中看到它的实现。毕竟,列表继承自ICollection,我应该在类列表(F12)中看到它,不是吗?@user829174:因为它是私有的。它仅通过
i集合可见
reference@user829174你在找什么?@user829174,你错过了显式接口实现的要点。通过显式实现,您不会将方法或属性视为类的公共API的一部分。正如James所演示的,您只能通过接口引用看到它;然后我按F12(转到定义)。我可以看到公共类列表:IList。。。。。ICollection这里我希望看到“public Object SyncRoot()”的实现
public class MySpecialList<T> : IEnumerable<T>
{
    // if we access from any other reference, we get the new, generic
    // interface
    public IEnumerator<T> GetEnumerator()
    {
        // your actual implementation
    }

    // so if we access from a reference of IEnumerable, we get older,
    // non-generic interface
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
var x = new MySpecialList<int>();
IEnumerable y = x;

// returns the generic enumerator
var genericEnum = x.GetEnumerator();  

// since called from an IEnumerable, gets legacy enumerator
var legacyEnum = y.GetEnumerator();