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
{
}
为什么可以这样操作?
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
{
}
为什么可以这样操作?
// 摘要:
// 获取包含 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; }
我查msdn它是这样定义的属性
public Dictionary<(Of <(TKey, TValue>)>)..::.ValueCollection Values { get; }这是什么写法?
还有vrhero看的是从元数据里面得到的?谢谢
看看他的申明就知道了,外部时看不到的,它申明为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
他内部就是这样定义的,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
而点入的时候它指向
public sealed class ValueCollection : ICollection <TValue>, IEnumerable <TValue>, ICollection, IEnumerable
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
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;
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);
}
那我想再请教上面的
Dictionary<string, string>.ValueCollection
和我们说的这些有联系吗?她为什么可以直接得到这个类?
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。