dynamic基元类型

C#编译器允许将一个表达式的类型标记为dynamic。还可以将一个表达式的结果放到一个变量中,并将变量的类型标记为dynamic。

代码使用dynamic表达式/变量来调用一个成员是,编译器会生成特殊的IL代码来描述所需的操作。这种特殊的代码称为payload(有效载荷)。在运行时,payload代码根据当前由dynamic表达式/变量引用的对象的实际类型来决定具体执行的操作。

有时候三元运算符会遇到前后类型不一致的情况。

dynamic基元类型

以下代码使用dynamic进行了演示。

using System;



namespace dynamic

{

    internal static class DynamicDemo

    {

        public static void Main()

        {

            for (Int32 demo = 0; demo < 2; demo++)

            {

                dynamic arg = (demo == 0) ? (dynamic)5 : (dynamic)"A";

                M(arg);

            }

        }



        private static void M(Int32 n)

        {

            Console.WriteLine("M(Int32):" + n);

        }



        private static void M(String s)

        {

            Console.WriteLine("M(String):" + s);

        }

    }

}

执行Main时,会得到以下输出:

dynamic基元类型

正常情况下,编译器不允许写代码将一个表达式从Object隐式转型为其他类型,必须使用显示转型。然而,编译器允许使用隐式转型语法将一个表达式从dynamic转型为其他类型:

Object o1 = 123;

Int32 n1 = o1;//Error

Int32 n2 = (Int32)0;//Ok



dynamic d1 = 123;

Int32 n3 = d1;//Ok

从dynamic转型为其他类型时,虽然编译器允许省略显示转型,但CLR会在运行时验证转型,确保类型安全性得以保持。如果对象的类型不兼容于要转换成的类型,CLR会抛出一个InvalidCastException异常。

 

你可能感兴趣的:(dynamic)