.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:技术随笔




}
}
留言反馈
里两个方法既然完全一样.Net就必须做一个选择.
应该是默认调用第一个匹配的方法.
是的,欢迎收听!
Ninputer,在Microsoft MSDN中文网络广播上讲VB 9.0的是你吗?我已经预订这门课了!:)
这几个Quiz是帮助理解泛型开结构和闭结构的,我会专门发帖讨论这个特性。
给Program类再增加一个辅助静态方法:
static void CallATest<T>(T obj)
{
A<T> a = new A<T>();
a.Test(obj);
}
然后在Main()方法中调用:
CallATest(3);
就能输出“T”。
不知这个算不算
A<object> a = new A<object>();
a.Test("12");
哈哈
JDK5.0 范型小测验1 ;
Java下的Framework编写(反射,泛型,元数据,CGLib,代码动态生成,AOP,动态语言嵌入)(1)--序 。
因为在编译时
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)了。
int
A2:
T
A3:
T
U