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 型により、Office オートメーション API などの COM API、IronPython ライブラリなどの動的 API、および HTML ドキュメント オブジェクト モデル (DOM: Document Object Model) へのアクセスが容易になります。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. コンパイル時に各変数の型を確認するには、WriteLine ステートメントの dyn または obj にマウス ポインターを置きます。To verify the type of each variable at compile time, place the mouse pointer over dyn or obj in the WriteLine statements. IntelliSense 機能によって、dyn には dynamicobj には object が表示されます。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

コンパイル時の dynobj の違いを確認するには、前の例の宣言と WriteLine ステートメントの間に次の 2 行を追加します。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.
    // 2/17/2009 9:12: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, itdoes 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

System.Dynamic.ExpandoObject
System.Dynamic.DynamicObject
dynamic 型の使用Using Type dynamic
objectobject
isis
asas
typeoftypeof
方法: as 演算子と is 演算子を使用して安全にキャストするHow to: Safely Cast by Using as and is Operators
チュートリアル: 動的オブジェクトの作成と使用Walkthrough: Creating and Using Dynamic Objects