C# 4 引入了一个新类型 dynamic。 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查。 大多数情况下,该对象就像具有类型 object 一样。
知识点:
dynamic类型会隐式转会为赋值类型。编译的时候均可通过,但是运行时会出现不对应的参数出错。
代码
using System;
using System.Text;
namespace Test
{
class Program
{
static void Foo(object x, object y) { Console.WriteLine("oo"); }
static void Foo(object x, string y) { Console.WriteLine("os"); }
static void Foo(string x, object y) { Console.WriteLine("so"); }
static void Foo(string x, int y) { Console.WriteLine("ss"); }
static void Foo(object x, object y,int z) { Console.WriteLine("xyz"); }
static void Main()
{
object o = "hello";
dynamic d = "goodbye";
int a = 1;
dynamic e = a;
Foo(d, e); //第一个参数为d string 第二个参数为e 隐式类型为int 结果为传参为(string,int) result:ss
Foo(o, d);//第一个参数为o object 第二个参数为d string 结果为传参为(object,string) result:os
Foo(e, e);//第一个参数为e 隐式类型int 第二个参数为e int 结果为传参为(object,object) result:os 此时没有(int,int)类型的重载 会默认为object result:oo
//下列写法编译不会出错 但是运行会出e错 因为没有(object,object,stirng)的重载
//Foo(e, e,d);//第一个参数为e 隐式类型int 第二个参数为e int 第三个参数为d string 结果为传参为(object,object,int) result:os 此时没有(int,int)类型的重载 会默认为object result:oo
Foo(e, e,e );//result:xyz
Console.ReadKey();
}
}
}
效果示例:
总结:
dynamic会优先匹配隐式转换符,如果没有会装箱成object去传值。假如都没有对应的