繁体   English   中英

我可以在C#中将对象强制转换为其通用类型吗?

[英]can I cast an object to it's generic type in C#?

很抱歉再次提出这个问题。 我已经在这里阅读了几个小时的相关主题,但仍然不太了解有关转换和泛型的一些问题。 我正在尝试创建自己的HashSet类,因为我们尚不能使用.net 3.5。

错误在下面的RetainAll方法中。 它可以很好地编译,但是在foreach语句上出现运行时错误“无法将类型为System.Collections.DictionaryEntry的对象转换为类型为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类,它实际上是集合中的对象。

我认为

foreach (T obj in set) {

应该

foreach (T obj in set.Values) {

枚举HashTable时,枚举数返回的类型为DictionaryEntry。 阅读此对象的键和值属性以获取所需的内容。

哈希表将键映射到值。 当您遍历哈希表中的每个项目时,该项目是键/值对(这就是DictionaryEntry类)。 您可能要改为遍历Keys属性或Values属性,具体取决于您如何在表中输入内容。

另请注意,Dictionary类是哈希表的通用版本,因此可能值得在其之上构建HashSet。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM