public void SetParameter(string name, object value, SqlDbType dbType){...}//函数1
public void SetParameter(string name, ParameterDirection pd, SqlDbType dbType){...}//函数2这是我写的两个重载函数,调用时 db.SetParameter("@startDate", 20091201, SqlDbType.BigInt);//此时调用的是函数1
db.SetParameter("@logonLevelID", 0, SqlDbType.Int);//此时调用的是函数2,目标是调用函数1object,enum在重载函数时遇到int调用就歧义?那我猜想byte应该也是这个结果吧!
这算不算系统bug?
那我举个例子,一个方法的参数是object,令一个方法的参数是string,也是一样的问题
这个明显是要调用函数1,0不是一个ParameterDirection类型
lz这样定义方法是危险的,通过参数类型重载方法,参数类型存在继承关系而实际执行的方法却不一致,很多时候会造成混乱。Console.WriteLine既可以用string也可以用object,因为他们的执行结果是一致的。
既然你的两个方法实现并不同,最好的办法就是给方法起不同的名字,比如SetParameterValue(string name, object value, SqlDbType dbType)这样。
如果完全匹配失败,会试图去寻找最匹配的,也就是存在转换成功的!
0-> enum OK! 0-> object ok!
但是编译器会寻找最合适的。假如你定义一个object 和一个 int参数的,如果你传入double肯定
调用的是int参数的函数。
第一个重载的第二个参数,你再怎么重写,我想去的参数都可以理解为 object
这个算不上是.NET的bug,是代码的问题。要说bug也可以,应该不能通过编译才好。
你的ParameterDirection是一个枚举,而且第一个值是0(Input)。
这种问题也让开发工具来承担,显然对开发工具要求太苛刻.
1.大部分类型都是从object继承,所以一般尽量不应在传参数时用object类型
2.你的两个方法,在中间参数传入0的时候,我认为都能调用
3.程序是本身是为解决问题,也应易用易读易维护,所以应在此时定义为两个不同的方法。
应该这样调用
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;namespace CSharpTest
{
enum tx { one,two,three}; class Program
{
static void Main(string[] args)
{
t1(0);
} static void t1(object oj)
{
Console.WriteLine("object");
}
static void t1(tx oj)
{
Console.WriteLine("Enum");
}
}
}输出Enum,
应该说是找最合适的参数匹配