装配中的脑袋

用程序装配大脑,再用大脑装配程序
随笔 - 118, 评论 - 1214, 引用 - 11

导航

关于

如果想发较大的信件,请用Ninputer @ gmail.com

不要在我的Blog评论中张贴广告,除非同意向我付款。

标签

每月存档

最新留言

广告

 

.NET 2.0的泛型,是在何时进行建造(Construct)?编译器在何时知道泛型的类型参数,何时不知道?不妨先来思考一下这几个Quiz:

Quiz 1:写出以下代码的输出

class Program { static void Main(string[] args) { A<int> a = new A<int>(); a.InternalCall(12); } } class A<T> { public void InternalCall(T obj) { Test(obj); } public void Test<U>(U obj) { Console.WriteLine("U"); } public void Test(int obj) { Console.WriteLine("int"); } }

到底哪个重载会被调用呢?仅从类的里面看,似乎只有一个选择;而在调用方看,却存在两个选择……

Quiz 2:写出以下代码的输出

class Program
{ static void Main(string[] args) { A<int> a = new A<int>(); a.Test(12); } } class A<T> { public void Test(T obj) { Console.WriteLine("T"); } public void Test(int obj) { Console.WriteLine("int"); } }

恩……这是个最奇特的例子,当你输入代码时,IDE会告诉你有两个一模一样的重载函数,那么会调用哪一个呢?

Quiz 3:写出以下代码的输出

class Program { static void Main(string[] args) { A<int> a = new A<int>(); a.Test(12); a.Test(12.0); } } class A<T> { public void Test<U>(U obj) { Console.WriteLine("U"); } public void Test(T obj) { Console.WriteLine("T"); } }
当你做出这些题后,你能想到这些特性可以用来编写什么样的程序吗?

 

打印 | 张贴于 2005-11-02 21:23:00 | Tag:技术随笔

留言反馈

#re: .NET 2.0 泛型Quiz 编辑
这个问题是有优先级存在的.你这里是优先Test(int obj)方法
2006-04-16 15:41:00 | [匿名用户:tom8251]
#re: .NET 2.0 泛型Quiz 编辑
问个写BLOG的问题。怎么在BLOG中设置代码高亮,和.NET风格的代码伸缩。
2006-04-06 09:56:00 | [匿名用户:HashMap]
#re: .NET 2.0 泛型Quiz 编辑
A2:
里两个方法既然完全一样.Net就必须做一个选择.
应该是默认调用第一个匹配的方法.
2005-11-09 00:18:00 | [匿名用户:czhenq]
#re: .NET 2.0 泛型Quiz 编辑
@Colin Han

是的,欢迎收听!
2005-11-06 15:37:00 | [匿名用户:Ninputer]
#re: .NET 2.0 泛型Quiz 编辑
哈哈!原来是这样!没有想到!

Ninputer,在Microsoft MSDN中文网络广播上讲VB 9.0的是你吗?我已经预订这门课了!:)
2005-11-04 19:11:00 | [匿名用户:Colin Han]
#re: .NET 2.0 泛型Quiz 编辑
kaneboy的方法是正确的。不过,却不需要在方法内部创建A的实例,将A<int>传入泛型方法即可。
这几个Quiz是帮助理解泛型开结构和闭结构的,我会专门发帖讨论这个特性。
2005-11-04 08:26:00 | [匿名用户:Ninputer]
#re: .NET 2.0 泛型Quiz 编辑
to Ninputer:

给Program类再增加一个辅助静态方法:
static void CallATest<T>(T obj)
{
A<T> a = new A<T>();
a.Test(obj);
}

然后在Main()方法中调用:

CallATest(3);

就能输出“T”。
2005-11-03 17:57:00 | [匿名用户:kaneboy]
#re: .NET 2.0 泛型Quiz 编辑
To Ninputer

不知这个算不算

A<object> a = new A<object>();
a.Test("12");

哈哈
2005-11-03 13:52:00 | [匿名用户:Goodspeed]
#re: .NET 2.0 泛型Quiz 编辑
头大!看不出来怎样可以输出"T"。不会是将范型参数改一下吧!:-p
2005-11-03 13:21:00 | [匿名用户:Colin Han]
#关于 范型 的一些资料链接。 编辑
.NET 2.0 泛型Quiz ;
JDK5.0 范型小测验1 ;
Java下的Framework编写(反射,泛型,元数据,CGLib,代码动态生成,AOP,动态语言嵌入)(1)--序 。
2005-11-03 12:36:00 | [匿名用户:longaway]
#JDK5.0 范型小测验1 编辑
JDK5.0 范型小测验
2005-11-03 11:42:00 | [匿名用户:smallnest]
#re: .NET 2.0 泛型Quiz 编辑
那么,如果Quiz 2如果要求输出“T”该如何写呢?不应该改动class A或者使用反射,因为那样就没有意义了。。
2005-11-03 10:07:00 | [匿名用户:Ninputer]
#re: .NET 2.0 泛型Quiz 编辑
个人感觉,调用哪个函数是在编译时就已经确定了。
2005-11-03 10:03:00 | [匿名用户:Colin Han]
#re: .NET 2.0 泛型Quiz 编辑
Q1: U
因为在编译时
public void InternalCall(T obj)
{
Test(obj);
}
中的obj是T类型的,而不是int型,编译器不会调用Test(int)而是调用一个最匹配的方法Test<U>(U).

Q2:int
这个有些奇怪,找不出理由,也许微软就这么定了。

Q3:T, U
这个比较简单,第一次调用Test(T)就可以匹配。第二个调用Test(T)匹配不了,只好用Test(U)了。

2005-11-03 09:57:00 | [匿名用户:Colin Han]
#re: .NET 2.0 泛型Quiz 编辑
如果上面讲的对的话,说明是寻找含有类型最匹配参数的函数执行. 这确实很有用处.
2005-11-03 09:49:00 | [匿名用户:SmartGuy]
#re: .NET 2.0 泛型Quiz 编辑
A1:
int

A2:
T

A3:
T
U
2005-11-03 09:38:00 | [匿名用户:火蛇儿]
#re: .NET 2.0 泛型Quiz 编辑
使用重载做模板特化感觉不如直接特化爽
2005-11-03 00:13:00 | [匿名用户:Bramble Whisper]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.0