C#中的受限泛型委托

4
我想要一个委托,它只能返回两种类型之一:一个 ActionResult 或一个 string。这可能吗?
4个回答

6

不,这是不可能的(至少在C# 4及以下版本中是如此)。泛型类型参数上没有"或"约束的支持。

还没有限制类型参数为精确类型的约束。所有的约束都是限制类型参数的基类。它们不能阻止您从它们继承。


1
请注意:类型“string”不能作为约束使用:它是一个密封类,而密封类不允许用于泛型类型参数。 - Abel
1
Abel:这是我第二点的一个特殊情况(没有“精确类型”约束)。泛型的基本设计目的是使您的代码更加“通用”。根据定义,将类型参数限制为单个类型与泛型存在的基本点相矛盾。 - Mehrdad Afshari
从没想过这样,但这很有道理。感谢您提供的额外解释 :) - Abel
请注意,您提到了“或”约束条件,但从某种意义上说,当您提供接口列表时,这些接口既是“或”约束条件,也是“与”约束条件。 - Abel
@Abel:你可以列出一系列类型。如果这样做,你将会限制类型参数继承/实现所有这些类型。 - Mehrdad Afshari

2
不,不是这样的。而且,这样做有什么好处呢?除非这两种类型有共同之处,否则你无法真正利用返回类型。
考虑一些调用委托的代码:
var returnValue = someDelegate();

在这种情况下,var的类型是什么?stringActionResult的唯一共同祖先是object,所以你只能从中得到这个结果。从静态类型的角度来看,你也可以将返回类型声明为object

一个约束只限于两种类型,难道不比包罗万象的对象更好吗?我将尝试使用对象来实现我的解决方案。感谢您的回答! - Ben Aston
2
调用代码仍然不知道类型是什么,因此在实际处理之前,它仍然必须显式地检查类型。这与非泛型委托没有什么区别,除了你必须添加一个处理意外类型的条件。泛型旨在维护不涉及任何特定类型的类/委托/方法的静态类型。 - Will Vousden

2

正如其他答案所解释的那样,您无法这样做,但是您可以通过为每种返回类型传递不同的continuations来解决此问题:

public delegate void MultiPathDelegate(Action<ActionResult> arAction, Action<string> strAction);

因此,检查返回类型发生在委托中而不是调用方。


0

像Zakalwe一样,我也不认为这样做有任何意义,但是...

您可以定义两个重载的方法,分别接受Func<string>Func<ActionResult>。一个私有方法可以接受委托并进一步处理它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接