首页 > 编程开发 > Objective-C编程 >
-
c#4.01之Dynamic 3
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 的一种功能。