我可以在C#中将对象转换为它的泛型类型吗?

时间:2009-04-06 20:35:06

标签: c# generics casting

很抱歉再次问这个问题。我已经在这里阅读了几个小时的相关主题,但仍然没有完全了解一些关于强制转换和泛型的问题。我正在尝试创建自己的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类,它们实际上是集合中的对象。

3 个答案:

答案 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。