Dictionary中定义了一个
public ValueCollection<TKey, TValue> Values
{
    get
    {
        if (this.values == null)
        {
            this.values = new ValueCollection<TKey, TValue>((Dictionary<TKey, TValue>) this);
        }
        return this.values;
    }
}
 
属性,但我看看源码中ValueCollection不是泛型类,
public sealed class ValueCollection : ICollection<TValue>, IEnumerable<TValue>, ICollection, IEnumerable
{
}
为什么可以这样操作?

解决方案 »

  1.   

    应该是另外有定义一个ValueCollection泛型类
      

  2.   

    你从哪儿看到的?说话要有根据...//
    // 摘要:
    //     获取包含 System.Collections.Generic.Dictionary<TKey,TValue> 中的值的集合。
    //
    // 返回结果:
    //     包含 System.Collections.Generic.Dictionary<TKey,TValue> 中的值的 System.Collections.Generic.Dictionary<TKey,TValue>.ValueCollection。
    public Dictionary<TKey, TValue>.ValueCollection Values { get; }
      

  3.   

    我是通过refltor里面看到的,
    我查msdn它是这样定义的属性
    public Dictionary<(Of <(TKey, TValue>)>)..::.ValueCollection Values { get; }这是什么写法?
    还有vrhero看的是从元数据里面得到的?谢谢
      

  4.   

    ValueCollection<T,K>这个是dictionary类的内部类
    看看他的申明就知道了,外部时看不到的,它申明为sealed
    [Serializable, DebuggerDisplay("Count = {Count}"), ComVisible(false), DebuggerTypeProxy(typeof(Mscorlib_DictionaryDebugView<,>))]
    public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback
    {
     ....
     [Serializable, DebuggerDisplay("Count = {Count}"), DebuggerTypeProxy(typeof(Mscorlib_DictionaryValueCollectionDebugView<,>))]
        public sealed class ValueCollection : ICollection<TValue>, IEnumerable<TValue>, ICollection, IEnumerable
      

  5.   

    回六楼这就是我想问的,
    他内部就是这样定义的,ValueCollection <T,K>这个是dictionary类的内部类 ,但是new后指向的是下面非泛型啊?
    public ValueCollection <TKey, TValue> Values 

        get 
        { 
            if (this.values == null) 
            { 
                this.values = new ValueCollection <TKey, TValue>((Dictionary <TKey, TValue>) this); 
            } 
            return this.values; 
        } 
    } public sealed class ValueCollection : ICollection <TValue>, IEnumerable <TValue>, ICollection, IEnumerable 
      

  6.   

    是的,就是不理解这句,我没有找到泛型的ValueCollection  <TKey, TValue>,
    而点入的时候它指向
    public sealed class ValueCollection : ICollection <TValue>, IEnumerable <TValue>, ICollection, IEnumerable 
      

  7.   

    ValueCollection 的全部定义[Serializable, DebuggerDisplay("Count = {Count}"), DebuggerTypeProxy(typeof(Mscorlib_DictionaryValueCollectionDebugView<,>))]
    public sealed class ValueCollection : ICollection<TValue>, IEnumerable<TValue>, ICollection, IEnumerable
    {
        // Fields
        private Dictionary<TKey, TValue> dictionary;    // Methods
        public ValueCollection(Dictionary<TKey, TValue> dictionary);
        public void CopyTo(TValue[] array, int index);
        public Enumerator<TKey, TValue> GetEnumerator();
        void ICollection<TValue>.Add(TValue item);
        void ICollection<TValue>.Clear();
        bool ICollection<TValue>.Contains(TValue item);
        bool ICollection<TValue>.Remove(TValue item);
        IEnumerator<TValue> IEnumerable<TValue>.GetEnumerator();
        void ICollection.CopyTo(Array array, int index);
        IEnumerator IEnumerable.GetEnumerator();    // Properties
        public int Count { get; }
        bool ICollection<TValue>.IsReadOnly { get; }
        bool ICollection.IsSynchronized { get; }
        object ICollection.SyncRoot { get; }    // Nested Types
        [Serializable, StructLayout(LayoutKind.Sequential)]
        public struct Enumerator : IEnumerator<TValue>, IDisposable, IEnumerator
        {
            private Dictionary<TKey, TValue> dictionary;
            private int index;
            private int version;
            private TValue currentValue;
            internal Enumerator(Dictionary<TKey, TValue> dictionary);
            public void Dispose();
            public bool MoveNext();
            public TValue Current { get; }
            object IEnumerator.Current { get; }
            void IEnumerator.Reset();
        }

    Expand Methods
     
      

  8.   

    楼上可能没明白我的意思,
    C# codepublic ValueCollection  <TKey, TValue> Values  
    {  
        get  
        {  
            if (this.values == null)  
            {  
                this.values = new ValueCollection  <TKey, TValue>((Dictionary  <TKey, TValue>) this); //泛型的ValueCollection<TKey, TValue>定义是关键的地方,没有找到却志向的它        }  
            return this.values;  
      

  9.   

    我们在外部通常这样使用
            Dictionary<string, string>.ValueCollection valueColl =openWith.Values;
    //已知values返回的是ValueCollection类,
    那既然是内部类,它是如何做到Dictionary<string, string>.ValueCollection的呢?
            Console.WriteLine();
            foreach( string s in valueColl )
            {
                Console.WriteLine("Value = {0}", s);
            }
      

  10.   

    DebuggerTypeProxyAttribute 指定类型的代理(或替身),并更改类型在调试器窗口中的显示方式。查看具有代理的变量时,代理将代替原始类型出现在“显示”中。调试器变量窗口仅显示代理类型的公共成员;不显示私有成员。 
      

  11.   

    我也猜过问题可能出现在这方面,读起来还真绕脑子,我研究一下,谢谢whycom,
    那我想再请教上面的
    Dictionary<string, string>.ValueCollection
    和我们说的这些有联系吗?她为什么可以直接得到这个类?
      

  12.   

    using System;
    using System.Collections.Generic;
    using System.Text;namespace WindowsApplication1
    {
        class Class3
        {
            private int aa;
            internal Class3(int aa)
            {
                this.aa = aa;
            }        public class class1
            {            public string bb="bb";
            }        public class1 bbb()
            {
                return new class1();
            }
        }
        class class4
        {
            public static void Main()
            {
                Class3 cls3 = new Class3(5555);
                Class3.class1 cls1 = cls3.bbb();
                Console.Write(cls1.bb);
                Console.Read();
            }
        }
    }
    之前的问题不明白,但你最后这个问题你看这个例子,内部类是可以通过类名得到的,
    但是内部类必须是public。