对 Func<T> 进行泛型类型约束

Posted

技术标签:

【中文标题】对 Func<T> 进行泛型类型约束【英文标题】:Making a generic type constraint on Func<T> 【发布时间】:2014-11-29 14:54:42 【问题描述】:

我想知道这是否可能:

public class Foo<T> where T : Func<T>

public class Foo<T> where T : Func<>

编译器似乎告诉我这是不可能的。我想我可以在构造函数中抛出运行时异常,但希望它是编译器错误。

有什么方法可以做到这一点?

【问题讨论】:

这里的正确解决方案可能是只接受T,然后在你的班级中使用Func&lt;T&gt; 我想过这个问题,但是我不得不像 .NET 人员一样创建 17 个重载来支持基本的 Func 案例。 :) 我知道这很愚蠢,只是想知道。 并不是说这是一个好主意,但您可以关注这个roslyn.codeplex.com/discussions/543871 线程并在 Roslyn 中进行更改并使用该编译器编译您的代码。 【参考方案1】:

很遗憾,您似乎运气不佳。 Func&lt;&gt;Action&lt;&gt; 都是委托类型,不能用作泛型类型约束。

这个答案总结得很好 C# Generics won't allow Delegate Type Constraints

【讨论】:

【参考方案2】:

正如另一个答案所告知的,您无法为 Func 实现泛型类型约束,但是 C# 7.3 允许您执行这样的约束

public class Foo<T> where T : Delegate

public class Foo<T> where T : MulticastDelegate

这是你能得到的最接近的。

【讨论】:

以上是关于对 Func<T> 进行泛型类型约束的主要内容,如果未能解决你的问题,请参考以下文章

为啥泛型 T 仅在具有约束时才被推断为文字类型?

C#如何将类型Type作为泛型T的参数T传递

C# 泛型方法约束为继承自某类时,调用方法,传子类实参,为什么报错?应该怎么写

Java认识泛型与容器

空条件运算符不适用于泛型方法中的 Func<T>

根据泛型类型中其值的类型来约束 Key