是否有可能限制参数不是代表?

时间:2012-02-03 16:26:23

标签: .net vb.net

考虑这两个功能:

'Overload 1
<Extension()>
Function ComputeReturnValue(Of TSource, TResult)(ByVal source As TSource, ByVal IfTrueFunc As 
System.Func(Of TSource, TResult), ByVal IfFalseFunc As System.Func(Of TSource, TResult)) As TResult

    Return If([some test is true], IfTrueFunc(source), IfFalseFunc(source))
End Function

'Overload 2
<Extension()>
Function ComputeReturnValue(Of TSource, TResult)(ByVal source As TSource, ByVal IfTrueValue As 
TResult, ByVal IfFalseFunc As TResult) As TResult

    Return If([some test is true], IfTrueValue, IfFalseValue)
End Function

用语言来说,ComputeReturnValue执行一些测试(现在不重要),并根据结果返回不同的值。我有两个版本,因为有时我想返回调用函数的结果来形成结果,有时我只想返回固定值。

问题是,当我(尝试)调用重载1而不是调用正确的函数时,编译器会调用重载2 ,并返回Func(Of TSource, TResult)对象,而不是结果调用函数。我看到这是因为重载2没有约束类型,所以Func是这个例程的有效参数,我愿意相信编译器在这种情况下正确选择了过载。

我的问题是:实现此目的的正确方法是什么来解决歧义,以便我可以传递值或引用类型并获得重载2,但是传递函数并获得重载1?我可以通过某种方式限制类型来实现这一目标吗?或者我应该只是将它们命名为不同的名称并避免问题?

(我知道我可以保留Func版本,并且当我想要返回一个值时传入一个简单的Function() IfTrueValue,但我试图尽可能地将其作为语法含糖。)

1 个答案:

答案 0 :(得分:1)

绝对给他们不同的名字。无论什么时候你反对重载决策,想想谁跟你有关 - 并且很可能不那么熟悉代码。对你来说任何棘手的事情对他们来说都会更棘手,而给方法赋予不同的描述性名称会让每个人的生活变得更好。