我想要一个委托,它只能返回两种类型之一:一个 ActionResult 或一个 string。这可能吗?
不,这是不可能的(至少在C# 4及以下版本中是如此)。泛型类型参数上没有"或"约束的支持。
还没有限制类型参数为精确类型的约束。所有的约束都是限制类型参数的基类。它们不能阻止您从它们继承。
var returnValue = someDelegate();
var
的类型是什么?string
和ActionResult
的唯一共同祖先是object
,所以你只能从中得到这个结果。从静态类型的角度来看,你也可以将返回类型声明为object
。正如其他答案所解释的那样,您无法这样做,但是您可以通过为每种返回类型传递不同的continuations来解决此问题:
public delegate void MultiPathDelegate(Action<ActionResult> arAction, Action<string> strAction);
因此,检查返回类型发生在委托中而不是调用方。
像Zakalwe一样,我也不认为这样做有任何意义,但是...
您可以定义两个重载的方法,分别接受Func<string>
和Func<ActionResult>
。一个私有方法可以接受委托并进一步处理它。