这算不算.NET的BUG,老鸟进来说说

zhouyanfss 2010-02-02 10:10:29

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,目标是调用函数1

object,enum在重载函数时遇到int调用就歧义?那我猜想byte应该也是这个结果吧!
这算不算系统bug?
...全文
375 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
wolf_Knight 2010-02-02
  • 打赏
  • 举报
回复
当然不算BUG,代码写的有问题
你妹的特盗不 2010-02-02
  • 打赏
  • 举报
回复
ParameterDirection,你的这个是 object的若干代孙子吧

c# java# vc++,等这些语言中 基本99%的都是继承至 object吧

我觉得你这两个重载本来写得就有问题
第一个重载的第二个参数,你再怎么重写,我想去的参数都可以理解为 object
lovexilove 2010-02-02
  • 打赏
  • 举报
回复
请相信.net的完美性 bug是不可能被你发现的
ouc_ajax 2010-02-02
  • 打赏
  • 举报
回复
函数重载,调用函数的时候会首先寻找完全匹配的!
如果完全匹配失败,会试图去寻找最匹配的,也就是存在转换成功的!
0-> enum OK! 0-> object ok!
但是编译器会寻找最合适的。

假如你定义一个object 和一个 int参数的,如果你传入double肯定
调用的是int参数的函数。
soaringbird 2010-02-02
  • 打赏
  • 举报
回复
的确是在传递参数时整数可以直接给枚举类型形参的
hyblusea 2010-02-02
  • 打赏
  • 举报
回复
我只是一支小鸟,进来膜拜老鸟的
weidewang1130 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 danjiewu 的回复:]
0的类型既不是object也不是ParameterDirection,但是.Net允许直接使用值来表示Enum,在很多时候会很方便,所以这里编译器就把0认为是ParameterDirection了。
lz这样定义方法是危险的,通过参数类型重载方法,参数类型存在继承关系而实际执行的方法却不一致,很多时候会造成混乱。Console.WriteLine既可以用string也可以用object,因为他们的执行结果是一致的。
既然你的两个方法实现并不同,最好的办法就是给方法起不同的名字,比如SetParameterValue(string name, object value, SqlDbType dbType)这样。
[/Quote]
同意!
danjiewu 2010-02-02
  • 打赏
  • 举报
回复
0的类型既不是object也不是ParameterDirection,但是.Net允许直接使用值来表示Enum,在很多时候会很方便,所以这里编译器就把0认为是ParameterDirection了。
lz这样定义方法是危险的,通过参数类型重载方法,参数类型存在继承关系而实际执行的方法却不一致,很多时候会造成混乱。Console.WriteLine既可以用string也可以用object,因为他们的执行结果是一致的。
既然你的两个方法实现并不同,最好的办法就是给方法起不同的名字,比如SetParameterValue(string name, object value, SqlDbType dbType)这样。
soaringbird 2010-02-02
  • 打赏
  • 举报
回复
db.SetParameter("@logonLevelID", 0, SqlDbType.Int);//此时调用的是函数2,目标是调用函数1
这个明显是要调用函数1,0不是一个ParameterDirection类型
soaringbird 2010-02-02
  • 打赏
  • 举报
回复
C#也有很多类似的方法,比如Debug.WriteLine(),Console.WriteLine()都有string和object参数的重载形式
mohugomohu 2010-02-02
  • 打赏
  • 举报
回复
应该算是bug,可是目前没有办法解决啊。
那我举个例子,一个方法的参数是object,令一个方法的参数是string,也是一样的问题
周公 2010-02-02
  • 打赏
  • 举报
回复
看看这篇文章,我想你可能会明白点。
把C#中方法重载说透
首先我们说一下什么是方法重载。在面对对象这样的高级语言中都允许我们在一个类中定义多个方法名相同、方法间参数个数和参数顺序不同的方法,对于参数个数不同或者参数列表不同的情况我们称之为参数列表不同。需要注意的是这里没有提到方法的返回值。也就是决定方法是否构成重载有两个条件:(1)在同一个类中;(2)方法名相同;(3)参数列表不同。本文讨论参数列表中的参数存在继承关系的条件下的重载。
ztenv 2010-02-02
  • 打赏
  • 举报
回复
不算,应该和类型转换有关系,
HooverHuang 2010-02-02
  • 打赏
  • 举报
回复
哥接的不是分,接的是寂寞
职业经理人 2010-02-02
  • 打赏
  • 举报
回复
不能算是bug,只是.net内部的一些规则而已
点点的遁地 2010-02-02
  • 打赏
  • 举报
回复
观望中。。。。我小鸟一个!~
flyerwing 2010-02-02
  • 打赏
  • 举报
回复
不算吧
十八道胡同 2010-02-02
  • 打赏
  • 举报
回复
不能算是bug
十八道胡同 2010-02-02
  • 打赏
  • 举报
回复
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,
应该说是找最合适的参数匹配
Justin-Liu 2010-02-02
  • 打赏
  • 举报
回复
理解为规则更好一些 不能算bug
加载更多回复(14)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧