2012-02-03 34 views
0

考虑以下两个功能:是否有可能限制参数不是代表?

'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的正确方法?我可以通过某种方式限制这些类型以实现此目的吗?或者我应该给他们起个不同的名字并避免这个问题?

(我知道我可以只保留函数功能的版本,并在琐碎Function() IfTrueValue传递时,我想返回一个值,但我试图让这句法含糖越好。)

回答

1

肯定给他们不同的名字。每当你对重载斗争,认为谁在追你来的 - 而且很可能是熟悉代码。对你而言,任何棘手的事情对他们来说都会变得更加棘手,而赋予方法不同的描述性名称会让每个人的生活更美好。

+0

我相信你是对的。我会给他们不同的名字。谢谢。 – 2012-02-03 16:45:34

相关问题