【问题标题】:Is it possible to set a Generic for a HashSet?是否可以为 HashSet 设置泛型?
【发布时间】:2012-01-17 18:07:08
【问题描述】:

如果可能的话,我想做类似的事情。

internal sealed class BufferPool<T, K> : K<Buffer<T>>
{
    public BufferPool() : base() {}
    //etc...
}

然后像这样调用这个类:

BufferPool<byte, HashSet> buffers;
buffers = new BufferPool<byte, HashSet>(bufferCapacity);

BufferPool<byte, List> buffers;
buffers = new BufferPool<byte, List>(bufferCapacity);

【问题讨论】:

  • 你试过了吗?如果有,发生了什么?
  • 你在这里问什么并不完全清楚;你能描述一下你试图构建的意图吗?
  • 是的,我已经尝试过,但无法正常工作。
  • 类型参数“K”不能与类型参数一起使用。
  • 从 .NET 集合类派生更容易实现,但也更容易陷入困境。见stackoverflow.com/a/2136235/932418

标签: c#


【解决方案1】:

您不能从类型参数继承(请参阅How to inherit from a generic parameter?)。您可以做的是将类型参数约束为有用类型和普通构造函数,并在您的类中实例化一个实例:

internal sealed class BufferPool<T, K> : IEnumerable<T> where K : IEnumerable<T>, new()
{
    K _bufferImpl = new K();

    public BufferPool() : base() { }
    //etc...
}

【讨论】:

    【解决方案2】:

    这是行不通的,因为编译器需要知道您的类继承/实现的类型/接口,以确定您的类是否满足该类型的合同要求。这包括重写抽象成员、实现接口成员等。

    当你在那里只有一个类型参数时,契约是未知的。这是编译器不支持的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      相关资源
      最近更新 更多