[C# 4.0] 3. Dynamic (3)

[ 2009-11-12 11:23:59 | 作者: yuhen ]
字号: | |
dynamic 关键字还可用于泛型参数。
class MyClass<T>
{
    public T X { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        dynamic o = new MyClass<dynamic>();
        dynamic a = new { X = 123 };
        o.X = a;

        Console.WriteLine(o.X.X);
    }
}

嗯,配合匿名类型对象倒是很好用。同样,MyClass<dynamic> 会被编译成 MyClass<object>。
private static void Main(string[] args)
{
    object o = new MyClass<object>();
    object a = new { X = 0x7b };

    ... ...
}

当然,在泛型集合中也可以方便地使用。
dynamic a = new { X = 123 };
var list = new List<dynamic> { a, "abc" };

dynamic o = list[0];
Console.WriteLine(o.X);

o = list[1];
Console.WriteLine(o);

既然编译器将 dynamic 替换成 object,那么我们可以用 dynamic 做类型基类吗?
class MyClass : dynamic
{
}

很遗憾!"Error 'MyClass': cannot derive from the dynamic type"。幸亏不行,否则只怕越搞越乱了。

至于 dynamic 在委托中的使用和方法没什么区别。
class Program
{
    public delegate dynamic TestHandle(dynamic x);

    static void Main(string[] args)
    {
        TestHandle o = (x) => x;
        Console.WriteLine(o(123));
    }
}

反编译
public delegate object TestHandle([Dynamic] object x);

private static void Main(string[] args)
{
    TestHandle o = x => x;
    ... ...
} 

---------- 分隔线 ----------------

需要说明一下,dynamic 关键字和 3.0 引入的 var 是不同的,尽管从表面上他们都隐藏了实际对象类型。但 var 是编译期行为,也就是说它仅仅是一个有限 block 内的一种 "缩写",编译器会在编译时直接将其替换成实际类型。而 dynamic 实际上对 object 的一种封装,它通过 DLR 在运行期进行 "间接" 访问。因此从功能和实现目标上来说,dynamic 才是对应 Javascript var 的一种功能。
评论Feed 评论Feed: http://www.rainsts.net/feed.asp?q=comment&id=878

这篇日志没有评论。

发表评论
表情图标
[smile] [confused] [cool] [cry]
[eek] [angry] [wink] [sweat]
[lol] [stun] [razz] [redface]
[rolleyes] [sad] [yes] [no]
[heart] [star] [music] [idea]
UBB代码
转换链接
表情图标
悄悄话
用户名:   密码:  
验证码 * 请输入验证码