在msdn 上看到的文章 Quick Puzzle: what does this program print?
你知道这段代码的输出吗?
class Hello
{
Type Unknown { get { return World.GetType(); } }
object[] Knowledge() { return Unknown.GetProperties(); }
string[] Library()
{
return Array.ConvertAll<object, string>(
Knowledge(),
delegate(object x) { return x.ToString(); });
}
public static Hello World { get { return new Hello(); } }
public static void Main(string[] args)
{
if (args.Length > 0)
Console.WriteLine(args[0]);
else
Main(World.Library());
}
}
答案 输出是Hello World
因为调用Hello.Main(string[] args)方法的时候,args的Length为0,
所以调用World.Library()方法,并将结果传递给Main方法来输出。
可以将Main(World.Library()) 变成
string result=World.Library();
Main(result);
所以最后的输出就是result,也就是World.Library()的返回值。
由于public static Hello World { get { return new Hello(); } }
所以World返回的是一个Hello对象,
所以World.Library()相当于调用
string[] Library(){
return Array.ConvertAll<object, string>(
Knowledge(),
delegate(object x) { return x.ToString(); });
}
这个方法主要是将KnowLedge()方法返回的Object[] 进行ToString()变成string[]
那么看下 object[] Knowledge() { return Unknown.GetProperties(); }
Knowledge()方法返回的是Unknown的GetProperties()方法的值,
Type Unknown { get { return World.GetType(); } }
在这里Unknown返回的是World.GetType();
由于World是Hello对象,所以World.GetType()返回的是Hello类型,
所以调用Hello类型的GetProperties()返回的是World的PropertyInfo,
而这个PropertyInfo的ToString()方法返回的字符串是"Hello World".
所以最终的结果就是Hello World,有兴趣的Debug下就知道了。