我的类两次实现了
我编写了自己的协变哈希表实现,它还继承了.NET的
当我使用
现在我希望它在LINQ中做同样的事情,但是编译器会抛出错误,因为它不知道选择哪个接口用于扩展方法:
错误1:无法找到源类型为'HashTable'的查询模式实现。未找到“Select”。考虑明确指定范围变量“x”的类型。 错误2:'HashTable'不包含名为'Select'的定义,也找不到接受类型为'HashTable'的第一个参数的扩展方法'Select'(是否缺少使用指令或程序集引用?) 也许有一些接口或继承技巧我不知道?
现在你可以看到为什么我不能让
IEnumerable<T>
接口。 我该如何在不需要每次强制转换 hashtable
的情况下使用 LINQ?
我编写了自己的协变哈希表实现,它还继承了.NET的
IDictionary<TKey, TValue>
。最终,它使用不同类型的T
两次实现了IEnumerable<T>
。我隐式地实现了主要的可枚举接口,而另一个则是显式实现。类似于这样(伪代码):class HashTable<TKey, TValue> :
...
IEnumerable<out IAssociation<out TKey, out TValue>>,
IEnumerable<out KeyValuePair<TKey, TValue>>
{
// Primary:
public IEnumerator<IAssociation<TKey, TValue>> GetEnumerator();
// Secondary:
IEnumerator<KeyValuePair<TKey, TValue>> IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator();
}
当我使用
foreach
循环哈希表时,它按预期地使用主要的可枚举项:as expected。using System;
using System.Collections.Generic;
using System.Linq;
var hashtable = new HashTable<string, int>();
foreach (var kv in hashtable)
{
// kv is IAssociation<string, int>
}
现在我希望它在LINQ中做同样的事情,但是编译器会抛出错误,因为它不知道选择哪个接口用于扩展方法:
var xs1 = from x in hashtable // <-- 1
select x;
var xs2 = hashtable.Select(x => x); // <-- 2
错误1:无法找到源类型为'HashTable'的查询模式实现。未找到“Select”。考虑明确指定范围变量“x”的类型。 错误2:'HashTable'不包含名为'Select'的定义,也找不到接受类型为'HashTable'的第一个参数的扩展方法'Select'(是否缺少使用指令或程序集引用?) 也许有一些接口或继承技巧我不知道?
对于那些询问的人,这是接口的完整树:
using SCG = System.Collections.Generic;
public class HashTable<TKey, TValue>
: IKeyedCollection<TKey, TValue>, SCG.IDictionary<TKey, TValue>
public interface IKeyedCollection<out TKey, out TValue>
: ICollection<IAssociation<TKey, TValue>>
public interface ICollection<out T> : SCG.IEnumerable<T>
public interface IAssociation<out TKey, out TValue>
// .NET Framework:
public interface IDictionary<TKey, TValue>
: ICollection<KeyValuePair<TKey, TValue>>
public interface ICollection<T>
: IEnumerable<T>
现在你可以看到为什么我不能让
KeyValuePair<TKey, TValue>
和 IAssociation<TKey, TValue>
相同。
Select
的 泛型参数 了吗?听起来它在推断这些参数上有点问题。特别是,你需要手动指定TSource
,但一旦你指定了一个,我认为你就需要同时指定另一个。不幸的是,这将阻止你返回匿名类型,除非使用一些麻烦的解决方法。 - Adam HouldsworthHashTable<TKey, TValue>
的其余继承/接口? - Ryan GatesIAssociation<TKey, TValue>
,而另一个使用KeyValuePair<TKey, TValue>
?我本来期望它们都使用相同的类型。 - Doctor Jones