很抱歉再次问这个问题。我已经在这里阅读了几个小时的相关主题,但仍然没有完全了解一些关于强制转换和泛型的问题。我正在尝试创建自己的HashSet类,因为我们还不能使用.net 3.5。
错误发生在下面的RetainAll方法中。它编译得很好但我得到一个运行时错误 '无法将类型为'System.Collections.DictionaryEntry'的对象强制转换为在foreach语句中键入'mycompany.UnivID'。
这是否意味着我无法将通用对象强制转换为其实现类型?我尝试过像
这样的事情foreach ((T) obj in set)
但他们没有编译。
相关代码是:
public sealed class HashSet<T> : ISet<T> {
private readonly Hashtable set;
public HashSet() {
this.set = new Hashtable();
}
public void RetainAll(ISet<T> c) {
lock (set) {
foreach (T obj in set) {
if (!c.Contains(obj))
this.set.Remove(obj);
}
}
}
}
实施类代码段是
public sealed class UnivIDSet : ISet {
private readonly ISet<UnivID> univIDs;
public UnivIDSet() : base() {
univIDs = new HashSet<UnivID>();
}
}
然后我们得到了UnivID
类,它们实际上是集合中的对象。
答案 0 :(得分:5)
我认为
foreach (T obj in set) {
应该是
foreach (T obj in set.Values) {
答案 1 :(得分:0)
枚举HashTable时,枚举器返回的类型是DictionaryEntry。阅读此对象的Key和Value属性以获得所需内容。
答案 2 :(得分:0)
Hashtables将键映射到值。迭代哈希表中的每个项时,该项是键/值对(这是DictionaryEntry类所在的)。您可能希望迭代Keys属性或Values属性,具体取决于您在表格中输入内容的方式。
另请注意,Dictionary类是哈希表的通用版本,因此可能需要在此基础上构建HashSet。