C# AsyncDelegate语法乱象,谁来解释?

疯癫行者 2014-06-08 05:55:37
有这样一种AsyncDelegate声明语法:

delegate void AsyncDelegate(int i, string s) ;
AsyncDelegate ad = new AsyncDelegate(someMethod);
IAsyncResult ar = ad.BeginInvoke(1, "str", null, null);

someMethod声明

void someMethod(int i, string s){
...
}

以上代码可以正确执行。
问题:假如同时声明两种代理,代理的对应的方法签名不同,比如说参数个数不同(类似下面的代码),能否正确执行呢?
结果是否定的,报语法错。原因在于下面代码中line 1和line2两行的语法语义不清。我很奇怪,C#中为何会出现这种低级问题。

delegate void AsyncDelegate(int i, string s) ; // line 1
delegate void AsyncDelegate(int i) ; // line2

AsyncDelegate ad1 = new AsyncDelegate(someMethod1);
IAsyncResult ar1 = ad1.BeginInvoke(1, "str", null, null);

AsyncDelegate ad2 = new AsyncDelegate(someMethod2);
IAsyncResult ar2 = ad2.BeginInvoke(1, "str", null, null);


void someMethod1(int i, string s){
...
}
void someMethod2(int i){
...
}
...全文
415 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯癫行者 2014-06-13
  • 打赏
  • 举报
回复
引用 15 楼 iyomumx 的回复:
[quote=引用 14 楼 stonefeng 的回复:] [quote=引用 13 楼 iyomumx 的回复:] [quote=引用 12 楼 stonefeng 的回复:] [quote=引用 11 楼 iyomumx 的回复:] delegate声明一个类型,不能出现两个同名类型再正常不过,哪里“乱”了?
这位兄弟,恳请你仔细看我在5楼的话。 关键是按照这个语法,我要声明两个具有不同参数个数,且具有异步执行能力的代理是无法实现的。 举个例子,比方说我要声明某个类的两个变量,这是没有问题的,因为变量的名字不同。但是我如何声明两个参数个数不同的AsyncDelegate类型的代理呢?因为这种语法不允许我添加类似变量名的东西,所以区分不开,所以造成一段代码只能声明一种签名的代理。[/quote] 你为什么要求这两个委托类型同名?从设计到实现它们都没有同名的理由。[/quote] 我要是不用这个名字,就不让我异步,我就得改用别的语法。[/quote] 代码都是人写的,谁阻止你调用BeginInvoke了?还是说你用了别人的类库,而别人只接受特定的委托签名?事情讲清楚,还能做朋友。[/quote] 我刚才没说清,我说不让异步的意思是换个名字的话,就没有了异步的能力,而且语法出错。
引用 16 楼 sbwwkmyd 的回复:
        delegate void AsyncDelegate<parameterType1, parameterType2>(parameterType1 value1, parameterType2 value2);  // line 1
        delegate void AsyncDelegate<parameterType>(parameterType value);
        static void someMethod1(int i, string s) { }
        static void someMethod2(int i) { }

            AsyncDelegate<int, string> ad1 = someMethod1;
            IAsyncResult ar1 = ad1.BeginInvoke(1, "str", null, null);
            AsyncDelegate<int> ad2 = someMethod2;
            IAsyncResult ar2 = ad2.BeginInvoke(1, null, null);
这位兄台解决了我的疑问,刚刚试过,可以了。 之前说“乱”,看来有些鲁莽,还是没有想到的个异步代理如何用泛型来解决,现在对觉得“乱”字不爽的朋友表示歉意。 帖子加分到100,回馈大家,谢谢!
showjim 2014-06-13
  • 打赏
  • 举报
回复
        delegate void AsyncDelegate<parameterType1, parameterType2>(parameterType1 value1, parameterType2 value2);  // line 1
        delegate void AsyncDelegate<parameterType>(parameterType value);
        static void someMethod1(int i, string s) { }
        static void someMethod2(int i) { }

            AsyncDelegate<int, string> ad1 = someMethod1;
            IAsyncResult ar1 = ad1.BeginInvoke(1, "str", null, null);
            AsyncDelegate<int> ad2 = someMethod2;
            IAsyncResult ar2 = ad2.BeginInvoke(1, null, null);
iyomumx 2014-06-13
  • 打赏
  • 举报
回复
引用 14 楼 stonefeng 的回复:
[quote=引用 13 楼 iyomumx 的回复:] [quote=引用 12 楼 stonefeng 的回复:] [quote=引用 11 楼 iyomumx 的回复:] delegate声明一个类型,不能出现两个同名类型再正常不过,哪里“乱”了?
这位兄弟,恳请你仔细看我在5楼的话。 关键是按照这个语法,我要声明两个具有不同参数个数,且具有异步执行能力的代理是无法实现的。 举个例子,比方说我要声明某个类的两个变量,这是没有问题的,因为变量的名字不同。但是我如何声明两个参数个数不同的AsyncDelegate类型的代理呢?因为这种语法不允许我添加类似变量名的东西,所以区分不开,所以造成一段代码只能声明一种签名的代理。[/quote] 你为什么要求这两个委托类型同名?从设计到实现它们都没有同名的理由。[/quote] 我要是不用这个名字,就不让我异步,我就得改用别的语法。[/quote] 代码都是人写的,谁阻止你调用BeginInvoke了?还是说你用了别人的类库,而别人只接受特定的委托签名?事情讲清楚,还能做朋友。
疯癫行者 2014-06-13
  • 打赏
  • 举报
回复
引用 13 楼 iyomumx 的回复:
[quote=引用 12 楼 stonefeng 的回复:] [quote=引用 11 楼 iyomumx 的回复:] delegate声明一个类型,不能出现两个同名类型再正常不过,哪里“乱”了?
这位兄弟,恳请你仔细看我在5楼的话。 关键是按照这个语法,我要声明两个具有不同参数个数,且具有异步执行能力的代理是无法实现的。 举个例子,比方说我要声明某个类的两个变量,这是没有问题的,因为变量的名字不同。但是我如何声明两个参数个数不同的AsyncDelegate类型的代理呢?因为这种语法不允许我添加类似变量名的东西,所以区分不开,所以造成一段代码只能声明一种签名的代理。[/quote] 你为什么要求这两个委托类型同名?从设计到实现它们都没有同名的理由。[/quote] 我要是不用这个名字,就不让我异步,我就得改用别的语法。
iyomumx 2014-06-13
  • 打赏
  • 举报
回复
引用 12 楼 stonefeng 的回复:
[quote=引用 11 楼 iyomumx 的回复:] delegate声明一个类型,不能出现两个同名类型再正常不过,哪里“乱”了?
这位兄弟,恳请你仔细看我在5楼的话。 关键是按照这个语法,我要声明两个具有不同参数个数,且具有异步执行能力的代理是无法实现的。 举个例子,比方说我要声明某个类的两个变量,这是没有问题的,因为变量的名字不同。但是我如何声明两个参数个数不同的AsyncDelegate类型的代理呢?因为这种语法不允许我添加类似变量名的东西,所以区分不开,所以造成一段代码只能声明一种签名的代理。[/quote] 你为什么要求这两个委托类型同名?从设计到实现它们都没有同名的理由。
疯癫行者 2014-06-13
  • 打赏
  • 举报
回复
引用 11 楼 iyomumx 的回复:
delegate声明一个类型,不能出现两个同名类型再正常不过,哪里“乱”了?
这位兄弟,恳请你仔细看我在5楼的话。 关键是按照这个语法,我要声明两个具有不同参数个数,且具有异步执行能力的代理是无法实现的。 举个例子,比方说我要声明某个类的两个变量,这是没有问题的,因为变量的名字不同。但是我如何声明两个参数个数不同的AsyncDelegate类型的代理呢?因为这种语法不允许我添加类似变量名的东西,所以区分不开,所以造成一段代码只能声明一种签名的代理。
iyomumx 2014-06-13
  • 打赏
  • 举报
回复
delegate声明一个类型,不能出现两个同名类型再正常不过,哪里“乱”了?
信风远 2014-06-13
  • 打赏
  • 举报
回复
一个委托绑定的函数,函数的形参数必须是一样的。
信风远 2014-06-13
  • 打赏
  • 举报
回复
delegate 的确最后实现的方法是以类的方法实现的。 如果写成类,很长的,而且固定的模式,所以由编译器完成就可以了,是一种简化应该是。 c#中有object类型。所以如果一个函数可以传一个参数object, 那么他其实就等于可以传任意个,任意类型的参数。 你的问题可以处理一下参数要么另定义一个类型, 复杂一点可以定义成object。
Leo55888 2014-06-13
  • 打赏
  • 举报
回复
太高深了 表示看不懂 顶起来
疯癫行者 2014-06-09
  • 打赏
  • 举报
回复
引用 6 楼 stonefeng 的回复:
[quote=引用 1 楼 rayyu1989 的回复:] AsyncDelegate ad2 = new AsyncDelegate(someMethod2); IAsyncResult ar2 = ad2.BeginInvoke(1, null, null);
抱歉,打代码的时候疏忽了,实际代码是你这样的,不通过。谢谢你提醒,我把帖子修改一下哈。[/quote] 帖子有回复,改不了了,特此更正一下,望各位周知。
疯癫行者 2014-06-09
  • 打赏
  • 举报
回复
引用 1 楼 rayyu1989 的回复:
AsyncDelegate ad2 = new AsyncDelegate(someMethod2); IAsyncResult ar2 = ad2.BeginInvoke(1, null, null);
抱歉,打代码的时候疏忽了,实际代码是你这样的,不通过。谢谢你提醒,我把帖子修改一下哈。
疯癫行者 2014-06-09
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
你从哪个书上看到过
delegate void AsyncDelegate(int i, string s) ;  // line 1
delegate void AsyncDelegate(int i) ;  // line2
这种代码能够编译通过?你编出c#编译器根本就会报错、根本不让你编译通过的这个代码来说c#怎么怎么地,是何用意呢?
哥们儿:用意不用意的不跟你讨论,我也不想讨论这个。我只想讨论这个语法现象,而且是我在实际代码中的困惑。 如果你说这是个类,为何不用class来定义?而用delegate?说明delegate是一种特殊的东西,可以作为方法指针(或者说引用)。那么在实际应用中,我需要定义两个不同的方法,并且异步调用。假如定义一个可以通过,为何不能定义第二个?有人说名称想通了就不能声明第二个,那么我实际需要第二个又怎么办?按照一般的思维,即使是按照类来定义,那么换个名字总可以定义第二个吧?但问题是,换个名字就不是异步的了,就要用别的语法。这让人怎么理解呢?只能说这种语法在同一个变量范围内,只能使用一次,这是一种限制!那么我觉得这样的语法是失败的。 声明,没说C#是失败的,c#有很多好的地方,就事论事,不想打架,我也是C#程序员。有问题就该讨论,不要急着否认,讨论出个结果就是进步,否则C#为何还要升级版本的?
  • 打赏
  • 举报
回复
c#编译器给你的错误说得很清楚,根本不能同时存在两个都叫做 AsyncDelegate 的class。纠结参数个数干什么呢?
  • 打赏
  • 举报
回复
你从哪个书上看到过
delegate void AsyncDelegate(int i, string s) ;  // line 1
delegate void AsyncDelegate(int i) ;  // line2
这种代码能够编译通过?你编出c#编译器根本就会报错、根本不让你编译通过的这个代码来说c#怎么怎么地,是何用意呢?
keyboard3_ 2014-06-08
  • 打赏
  • 举报
回复
估计是这个原因,委托声明的不是方法而是类,而类区分的只有类名。 delegate void AsyncDelegate(int i, string s) ; // line 1 delegate void AsyncDelegate(int i) ; // line2 这是声明了两个相同的类,会忽视后面的类ps(我试过,后面AsyncDelegate ad1 = new AsyncDelegate()只能接受2个参数的方法,也就是(int ,string))。这是个人浅显的理解,不知道对不对。
rayyu1989 2014-06-08
  • 打赏
  • 举报
回复
AsyncDelegate ad2 = new AsyncDelegate(someMethod2); IAsyncResult ar2 = ad2.BeginInvoke(1, null, null);

110,535

社区成员

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

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

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