Visual Studio 2017 RC에 대한 최신 설명서는 Visual Studio 2017 RC 설명서를 참조하세요.
동적 유형을 통해 구현된 작업에서 이 유형의 역할은 컴파일 시간 유형 확인을 우회하고 대신 런타임에 이러한 작업을 해결하는 것입니다. 동적 유형은 COM API(예: Office 자동화 API), 동적 API(예: IronPython 라이브러리) 및 HTML DOM(문서 개체 모델)에 대한 액세스를 단순화합니다.
대부분의 경우 동적 유형은 객체 유형과 동일하게 동작합니다. 그러나 동적 유형의 표현식이 포함된 작업은 컴파일러에서 구문 분석되거나 유형 검사되지 않습니다. 컴파일러는 이 작업에 대한 정보를 함께 패키지하며, 이 정보는 나중에 런타임 작업을 계산하는 데 사용됩니다. 이 프로세스 동안 동적 유형의 변수는 object 유형의 변수로 컴파일됩니다. 따라서 동적 유형은 런타임이 아닌 컴파일 타임에만 존재합니다.
다음 예에서는 동적 유형의 변수와 object 유형의 변수를 비교합니다. 컴파일 타임에 각 변수의 유형을 확인하려면 WriteLine 문의 dyn 또는 obj 위에 마우스 포인터를 놓습니다. IntelliSense는 dyn 의 "동적"과 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의 런타임 유형을 표시합니다. 이 시점에서 둘 다 동일한 정수 유형을 갖습니다. 다음 출력이 생성됩니다.
System.Int32
System.Int32
dyn과 obj의 차이점을 확인하려면 이전의 선언과 WriteLine 문 사이를 살펴보세요. 예 두 줄 사이에 다음을 추가합니다.
dyn = dyn + 3; obj = obj + 3;
obj + 3 표현식에 정수와 객체를 추가하려는 시도에 대한 컴파일러 오류를 보고합니다. 그러나 dyn + 3 오류는 보고되지 않습니다. dyn이 포함된 표현식은 dyn이 동적 유형이기 때문에 컴파일 타임에 확인되지 않습니다.
컨텍스트
동적 키워드는 다음과 같은 상황에서 직접 또는 생성된 유형의 구성 요소로 나타날 수 있습니다.
선언에서 속성, 필드, 인덱서, 매개 변수, 반환 값 또는 유형 제약 조건으로서의 유형입니다. 다음 클래스 정의는 여러 다른 선언에서 동적을 사용합니다.
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; } } }
명시적 유형 변환에서는 변환 대상 유형으로 사용됩니다.
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에 대한 인수로 생성된 유형의 일부인 모든 컨텍스트에서. 예를 들어 다음 표현식에서는 Dynamic을 사용할 수 있습니다.
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));
예
다음 예에서는 여러 선언과 함께 동적을 사용합니다. Main은 또한 런타임 유형 검사와 컴파일 타임 유형 검사를 사용합니다.
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