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?

解决方案 »

  1.   

    不能算是bug,只是.net内部的一些规则而已
      

  2.   

    应该算是bug,可是目前没有办法解决啊。
    那我举个例子,一个方法的参数是object,令一个方法的参数是string,也是一样的问题
      

  3.   

    C#也有很多类似的方法,比如Debug.WriteLine(),Console.WriteLine()都有string和object参数的重载形式
      

  4.   

     db.SetParameter("@logonLevelID", 0, SqlDbType.Int);//此时调用的是函数2,目标是调用函数1
    这个明显是要调用函数1,0不是一个ParameterDirection类型
      

  5.   

    0的类型既不是object也不是ParameterDirection,但是.Net允许直接使用值来表示Enum,在很多时候会很方便,所以这里编译器就把0认为是ParameterDirection了。
    lz这样定义方法是危险的,通过参数类型重载方法,参数类型存在继承关系而实际执行的方法却不一致,很多时候会造成混乱。Console.WriteLine既可以用string也可以用object,因为他们的执行结果是一致的。
    既然你的两个方法实现并不同,最好的办法就是给方法起不同的名字,比如SetParameterValue(string name, object value, SqlDbType dbType)这样。
      

  6.   

    函数重载,调用函数的时候会首先寻找完全匹配的!
    如果完全匹配失败,会试图去寻找最匹配的,也就是存在转换成功的!
    0-> enum OK!  0-> object ok!
    但是编译器会寻找最合适的。假如你定义一个object 和一个 int参数的,如果你传入double肯定
    调用的是int参数的函数。
      

  7.   

    请相信.net的完美性 bug是不可能被你发现的
      

  8.   

    ParameterDirection,你的这个是 object的若干代孙子吧c# java# vc++,等这些语言中 基本99%的都是继承至 object吧我觉得你这两个重载本来写得就有问题
    第一个重载的第二个参数,你再怎么重写,我想去的参数都可以理解为 object
      

  9.   

    当然不算BUG,代码写的有问题
      

  10.   

    当给出一个ParameterDirection类型变量时,编译器不能识别它是object的还是ParameterDirection的。
    这个算不上是.NET的bug,是代码的问题。要说bug也可以,应该不能通过编译才好。
      

  11.   

    只能说代码写的补规范,但不是BUG
      

  12.   

    不是BUG,net里方法的搜索规则是通过Binder这个类提供的,所以不管是静态联编和动态调用都采用同一个默认的规则,也就是Type.DefaultBinder这个默认的Binder实现,它的规矩就是就近原则,最佳匹配能被转换的最接近类型。
      

  13.   

    不是BUG。
    你的ParameterDirection是一个枚举,而且第一个值是0(Input)。
      

  14.   

    我认为不是bug.
    这种问题也让开发工具来承担,显然对开发工具要求太苛刻.
    1.大部分类型都是从object继承,所以一般尽量不应在传参数时用object类型
    2.你的两个方法,在中间参数传入0的时候,我认为都能调用
    3.程序是本身是为解决问题,也应易用易读易维护,所以应在此时定义为两个不同的方法。
      

  15.   

    。你这么定义也确实是很危险的啊。。唯一不同的一个参数还存在继承关系,这么是非常容易出问题的,当然这个肯定不是BUG。。
      

  16.   

    db.SetParameter("@logonLevelID",(ParameterDirection )0, SqlDbType.Int);
    应该这样调用
      

  17.   

    理解为规则更好一些 不能算bug
      

  18.   

    using System;
    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,
    应该说是找最合适的参数匹配