English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 동적 타입(Dynamic)

C#4.0(.NET 4.5C#에서는 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");// 실행 중 오류, 컴파일 중 오류가 없습니다
        stud.DisplayStudentInfo("1");// 실행 중 오류, 컴파일 중 오류가 없습니다
        stud.FakeMethod();// 실행 중 오류, 컴파일 중 오류가 없습니다
    }
}
public class Student
{
    public void DisplayStudentInfo(int id)
    {
    }
}

위 예제에서, C# 컴파일러는 매개변수, 매개변수 타입을 확인하지 않습니다. 그것은 실행 시에 이를 확인하고, 잘못된 경우 실행 시 예외를 발생시킵니다. 동적 타입은 Visual Studio IntelliSense를 지원하지 않습니다. 동적 타입은 Visual Studio IntelliSense를 지원하지 않습니다.

동적 언어 실행 시간(DLR) API는 C# 동적 타입의 기본 구조를 지원합니다。