C# - 动态类型
C# 4.0 (.NET 4.5) 引入了一种名为 dynamic
的新类型,它避免了编译时类型检查。dynamic
类型在编译时跳过类型检查;相反,它在运行时解析类型。
动态类型变量使用 dynamic
关键字定义。
示例:动态变量
dynamic MyDynamicVar = 1;
在大多数情况下,编译器会将动态类型编译为对象类型。但是,动态类型变量的实际类型将在运行时解析。
示例:运行时动态类型
dynamic MyDynamicVar = 1;
Console.WriteLine(MyDynamicVar.GetType());
输出
System.Int32动态类型根据赋给的值在运行时改变类型。以下示例展示了动态变量如何根据赋给的值改变类型。
示例:动态
static void Main(string[] args)
{
dynamic MyDynamicVar = 100;
Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
MyDynamicVar = "Hello World!!";
Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
MyDynamicVar = true;
Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
MyDynamicVar = DateTime.Now;
Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
}
输出
值:100,类型:System.Int32值:Hello World!!,类型:System.String
值:True,类型:System.Boolean
值:01-01-2014,类型:System.DateTime
动态类型变量隐式转换为其他类型。
示例:动态类型转换
dynamic d1 = 100;
int i = d1;
d1 = "Hello";
string greet = d1;
d1 = DateTime.Now;
DateTime dt = d1;
方法和参数
如果您将类对象赋给动态类型,那么编译器将不会检查持有自定义类对象的动态类型的正确方法和属性名称。请考虑以下示例。
示例:调用方法
class Program
{
static void Main(string[] args)
{
dynamic stud = new Student();
stud.DisplayStudentInfo(1, "Bill");// run-time error, no compile-time error
stud.DisplayStudentInfo("1");// run-time error, no compile-time error
stud.FakeMethod();// run-time error, no compile-time error
}
}
public class Student
{
public void DisplayStudentInfo(int id)
{
}
}
在上述示例中,C# 编译器不检查参数数量、参数类型或不存在的参数。它在运行时验证这些内容,如果无效,则会抛出运行时异常。请注意,Visual Studio IntelliSense 不支持动态类型。请注意,Visual Studio IntelliSense 不支持动态类型。
动态语言运行时 (DLR) API 提供了支持 C# 中动态类型的基础设施。有关 DLR 的更多信息,请访问 动态语言运行时概述。