gpt4 book ai didi

c# - 为什么我不能通过索引访问 KeyedCollection 项目?

转载 作者:行者123 更新时间:2023-11-30 14:13:25 25 4
gpt4 key购买 nike

我有这段代码(我希望它能工作,但它失败了)。我真的不知道为什么。请帮忙

     static void Main(string[] args)
{
var x = new MyKeyedCollection();

x.Add(new MyType() { Key = 400L, Value = 0.1 });
x.Add(new MyType() { Key = 200L, Value = 0.1 });
x.Add(new MyType() { Key = 100L, Value = 0.1 });
x.Add(new MyType() { Key = 300L, Value = 0.1 });

//foreach (var item in x)
for (int i = 0; i < x.Count; i++)
{
//Debug.WriteLine(item.PriceLevel);
Debug.WriteLine(x[i].Key);
}
}
}

public class MyType
{
public long Key;
public double Value;
}

public class MyKeyedCollection : KeyedCollection<long, MyType>
{
protected override long GetKeyForItem(MyType item)
{
return item.Key;
}
}

异常(exception):

System.Collections.Generic.KeyNotFoundException was unhandled
Message=The given key was not present in the dictionary.
Source=mscorlib StackTrace: at System.ThrowHelper.ThrowKeyNotFoundException() at System.Collections.Generic.Dictionary2.get_Item(TKey key)
at System.Collections.ObjectModel.KeyedCollection
2.get_Item(TKey key) at KeyedCollectionTest.Program.Main(String[] args) in ...\Program.cs:line 25 at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:

为什么它试图获取 Key 而不是索引? key 显然很长而不是整数。我确定我之前使用过 KeyedCollection,它对长键和 int 索引工作得很好。

我尝试在版本 2、3.5、4、4.5 中编译(使用 VS2012)...

不明白。

最佳答案

How come it tries to get Key instead of index? Key is clearly long and not int.

但是int可转换为 long , 所以它是一个有效的候选成员。

问题是 this[TKey key]索引器最初在 KeyedCollection 中声明,而 this[int index]索引器最初在 Collection 中声明.重载决策规则指定首先搜索最派生的类,并且只有在该类型中首先声明的成员被认为是开始的。仅当那个搜索失败时,编译器才会向上移动到类型层次结构中的下一个级别。

所以如果你写:

Collection<MyType> collection = x;
for (int i = 0; i < x.Count; i++)
{
Debug.WriteLine(collection[i].Key);
}

它会起作用——因为 collection 的编译时类型只是Collection<T>只有有“int index”索引器。

这是一个示例,它在不使用泛型、索引器或抽象类的情况下显示了相同的行为:

using System;

class Base
{
public void Foo(int x)
{
Console.WriteLine("Base.Foo(int)");
}
}

class Derived : Base
{
public void Foo(long y)
{
Console.WriteLine("Derived.Foo(long)");
}
}

class Program
{
static void Main()
{
Derived x = new Derived();
Base y = x;
x.Foo(5); // Derived.Foo(long)
y.Foo(5); // Base.Foo(int)
}
}

查看我的 article on overloading了解更多有趣的规则。

关于c# - 为什么我不能通过索引访问 KeyedCollection 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com