标题:函数的优先级
只看楼主
咕嘟一叶
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-1-9
结帖率:100%
已结贴  问题点数:20 回复次数:2 
函数的优先级
using N1;
namespace N1
{
public static class E
{
public static void F(this object obj, int i) { }
public static void F(this object obj, string s) { }
}
}
class A { }
class B
{
public void F(int i) { }
}
class C
{
public void F(object obj) { }
}
class X
{
static void Test(A a, B b, C c) {
a.F(1); // E.F(object, int)           这里为什么是用E中的方法?
a.F("hello"); // E.F(object, string)  这里为什么是用E中的方法?
b.F(1); // B.F(int)                   这里为什么是用E中的方法?
b.F("hello"); // E.F(object, string)  这里为什么是用B中的方法?
c.F(1); // C.F(object)                这里为什么是用C中的方法?
c.F("hello"); // C.F(object)          这里为什么是用C中的方法?

}
}  
搜索更多相关主题的帖子: void public 优先级 hello 
2013-01-09 11:23
咕嘟一叶
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-1-9
得分:0 
菜鸟,难道这个问题太2了 没人愿帮忙了
2013-01-09 11:37
mmxo
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:13
帖 子:189
专家分:1090
注 册:2012-11-7
得分:20 
这问题一点都不2,其本质是类的扩展方法的使用,下面一一回答:

0、基础:类E中对object对象扩展了2个方法(或者说是一个方法的两种重载);

1、A是一个空类,但其基类是object,所以A的实例有F(int i)方法,调用的a.F(1)方法与此方法签名相同,其实准确的说法我认为不是说“调用了E中的方法”,而是“调用了A中的方法”,只不过静态类E将A的基类进行了扩展而已;

2、同上,只不过a.F("hello")方法与另一个重载F(string s)签名相同,所以调用的是这个重载形式;

3、类B有一个方法F(int i),当类中方法与其基类方法签名相同时,类中的方法优先权高于基类方法,故调用类B的实例b的F方法就是调用类B中定义的方法F;

4、类B中没有与F(string)签名相同的方法,而其基类型object由于E类的扩展而有这种签名的方法,所以调用b.F("hello")方法调用的也是其基类中的方法F(string),就是在E类的F方法的第二种重载形式;

5、类C中有个方法F(object),而object是任何东西的基类,所以用任何参数调用类C的实例的F方法都符合F方法的签名,都是调用类C中的F方法而不会调用其基类的方法;

6、同上。

不是没人愿帮,只是最近工作较忙,只有晚上抽空来看下,不好意思!

为提高中华编程水平而奋斗
2013-01-09 20:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-395804-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.068322 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved