dynamic (Справочник по C#)dynamic (C# Reference)

Тип dynamic включает операции, в которых он применяется для обхода проверки типов во время компиляции.The dynamic type enables the operations in which it occurs to bypass compile-time type checking. Такие операции разрешаются во время выполнения.Instead, these operations are resolved at run time. Тип dynamic упрощает доступ к API COM, таким как API автоматизации Office, а также к динамическим API, таким как библиотеки IronPython, и к HTML-модели DOM.The dynamic type simplifies access to COM APIs such as the Office Automation APIs, and also to dynamic APIs such as IronPython libraries, and to the HTML Document Object Model (DOM).

Тип dynamic в большинстве случаев ведет себя как тип object.Type dynamic behaves like type object in most circumstances. При этом операции, содержащие выражения типа dynamic, не разрешаются или тип проверяется компилятором.However, operations that contain expressions of type dynamic are not resolved or type checked by the compiler. Компилятор объединяет сведения об операции, которые впоследствии будут использоваться для оценки этой операции во время выполнения.The compiler packages together information about the operation, and that information is later used to evaluate the operation at run time. В рамках этого процесса переменные типа dynamic компилируются в переменные типа object.As part of the process, variables of type dynamic are compiled into variables of type object. Таким образом, тип dynamic существует только во время компиляции, но не во время выполнения.Therefore, type dynamic exists only at compile time, not at run time.

В следующем примере переменной типа dynamic противопоставляется переменная типа object.The following example contrasts a variable of type dynamic to a variable of type object. Чтобы проверить тип каждой переменной во время компиляции, наведите указатель мыши на dyn или obj в операторах WriteLine.To verify the type of each variable at compile time, place the mouse pointer over dyn or obj in the WriteLine statements. IntelliSense отображает dynamic для dyn и object для obj.IntelliSense shows dynamic for dyn and object for obj.

class Program
{
    static void Main(string[] args)
    {
        dynamic dyn = 1;
        object obj = 1;

        // Rest the mouse pointer over dyn and obj to see their
        // types at compile time.
        System.Console.WriteLine(dyn.GetType());
        System.Console.WriteLine(obj.GetType());
    }
}

Операторы WriteLine отображают типы времени выполнения dyn и obj.The WriteLine statements display the run-time types of dyn and obj. На этом этапе оба имеют один и тот же тип — целое число.At that point, both have the same type, integer. Выводятся следующие результаты.The following output is produced:

System.Int32

System.Int32

Чтобы увидеть разницу между dyn и obj во время компиляции, добавьте между объявлениями и операторами WriteLine в предыдущем примере следующие две строки:To see the difference between dyn and obj at compile time, add the following two lines between the declarations and the WriteLine statements in the previous example.

dyn = dyn + 3;
obj = obj + 3;

При попытке добавления целого числа и объекта в выражение obj + 3 выдается ошибка компилятора.A compiler error is reported for the attempted addition of an integer and an object in expression obj + 3. При этом для dyn + 3 ошибка не возникает.However, no error is reported for dyn + 3. Выражение, которое содержит dyn, не проверяется во время компиляции, поскольку тип dyn имеет значение dynamic.The expression that contains dyn is not checked at compile time because the type of dyn is dynamic.

КонтекстContext

В следующих ситуациях ключевое слово dynamic может отображаться как есть или как компонент сконструированного типа:The dynamic keyword can appear directly or as a component of a constructed type in the following situations:

  • В объявлениях: как тип свойства, поля, индексатора, параметра возвращаемого значения, локальной переменной или ограничения типа.In declarations, as the type of a property, field, indexer, parameter, return value, local variable, or type constraint. В представленном ниже определении класса ключевое слово dynamic используется сразу в нескольких различных объявлениях.The following class definition uses dynamic in several different declarations.

    class ExampleClass
    {
        // A dynamic field.
        static dynamic field;
    
        // A dynamic property.
        dynamic prop { get; set; }
    
        // A dynamic return type and a dynamic parameter type.
        public dynamic exampleMethod(dynamic d)
        {
            // A dynamic local variable.
            dynamic local = "Local variable";
            int two = 2;
    
            if (d is int)
            {
                return local;
            }
            else
            {
                return two;
            }
        }
    }
    
  • В явных преобразованиях типа: как целевой тип преобразования.In explicit type conversions, as the target type of a conversion.

    static void convertToDynamic()
    {
        dynamic d;
        int i = 20;
        d = (dynamic)i;
        Console.WriteLine(d);
    
        string s = "Example string.";
        d = (dynamic)s;
        Console.WriteLine(d);
    
        DateTime dt = DateTime.Today;
        d = (dynamic)dt;
        Console.WriteLine(d);
    
    }
    // Results:
    // 20
    // Example string.
    // 7/25/2018 12:00:00 AM
    
  • В любом контексте, где типы служат в качестве значений, например справа от оператора is или as, либо в качестве аргумента для typeof в рамках сконструированного типа.In any context where types serve as values, such as on the right side of an is operator or an as operator, or as the argument to typeof as part of a constructed type. Например, ключевое слово dynamic можно использовать в следующих выражениях:For example, dynamic can be used in the following expressions.

    int i = 8;
    dynamic d;
    // With the is operator.
    // The dynamic type behaves like object. The following
    // expression returns true unless someVar has the value null.
    if (someVar is dynamic) { }
    
    // With the as operator.
    d = i as dynamic;
    
    // With typeof, as part of a constructed type.
    Console.WriteLine(typeof(List<dynamic>));
    
    // The following statement causes a compiler error.
    //Console.WriteLine(typeof(dynamic));
    

ПримерExample

В следующем примере dynamic используется в нескольких объявлениях.The following example uses dynamic in several declarations. Метод Main также противопоставляет проверку типов во время компиляции.The Main method also contrasts compile-time type checking with run-time type checking.

using System;

namespace DynamicExamples
{
    class Program
    {
        static void Main(string[] args)
        {
            ExampleClass ec = new ExampleClass();
            Console.WriteLine(ec.exampleMethod(10));
            Console.WriteLine(ec.exampleMethod("value"));

            // The following line causes a compiler error because exampleMethod
            // takes only one argument.
            //Console.WriteLine(ec.exampleMethod(10, 4));

            dynamic dynamic_ec = new ExampleClass();
            Console.WriteLine(dynamic_ec.exampleMethod(10));

            // Because dynamic_ec is dynamic, the following call to exampleMethod
            // with two arguments does not produce an error at compile time.
            // However, it does cause a run-time error. 
            //Console.WriteLine(dynamic_ec.exampleMethod(10, 4));
        }
    }

    class ExampleClass
    {
        static dynamic field;
        dynamic prop { get; set; }

        public dynamic exampleMethod(dynamic d)
        {
            dynamic local = "Local variable";
            int two = 2;

            if (d is int)
            {
                return local;
            }
            else
            {
                return two;
            }
        }
    }
}
// Results:
// Local variable
// 2
// Local variable

Дополнительные сведения и примеры см. в разделе Использование типа dynamic.For more information and examples, see Using Type dynamic.

См. такжеSee also