【问题标题】:Restrict type of generic class to List of struct将泛型类的类型限制为结构列表
【发布时间】:2020-07-16 08:45:27
【问题描述】:

有一个类似这样的通用接口

interface IMatch<T>
{
    bool MatchWithExpected(T actualValue);
}

这个接口针对不同类型的实现已经可用(Int、struct、Enum 等)。

我有一个名为ObjectType 的结构。我想要一个与ObjectType 列表一起使用的上述接口的实现。

我能够做到这一点的唯一方法是执行以下操作

class MultiStructMatch<T> : IMatch<T> where T is List<ObjectType> 

有什么方法可以使List&lt;ObjectType&gt; 泛型表示List&lt;struct&gt;? 我尝试了List&lt;System.ValueType&gt;,但无法将List&lt;ObjectType&gt; 转换为List&lt;System.ValueType&gt;

【问题讨论】:

  • 看来你真正想要的是class MultiStructMatch&lt;T&gt;:IMatch&lt;List&lt;T&gt;&gt; where T:struct

标签: c# oop generics


【解决方案1】:

您可以将 List&lt;T&gt; 传递给 IMatch&lt;&gt; 并将类型约束应用于 T :

class MultiStructMatch<T> : IMatch<List<T>> where T: struct
{
}

并用 :

实例化它
struct M
{
}
...
var m = new MultiStructMatch<M>;

【讨论】:

  • where T : struct,缺少冒号
【解决方案2】:

您需要第二个通用参数并像这样声明您的类:

class MultiStructMatch<T, TElement> : IMatch<T> 
    where T : List<TElement> 
    where TElement : struct
{}

并实例化它,例如:

var m = new MultiStructMatch<List<ObjectType>, ObjectType>();

这个语法有点笨拙,因为额外的类型参数似乎是多余的。但我没有看到更好的方法来应用struct 约束。

显然Panagiotis 找到了更好的语法。

【讨论】:

  • 是的。语法明智,另一个答案更好。但我也学到了一些新东西,所以对你的回答 +1。
猜你喜欢
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2010-12-02
  • 2018-02-17
相关资源
最近更新 更多