2014-10-14 3 views
3

다음 코드를 고려하십시오왜 C# 컴파일러는 반환 값 유형과 변수 유형이 일치하지 않습니까?

static void Main() 
{ 
    dynamic a = 1; 
    int b = OneMethod(a); 
} 

private static string OneMethod(int number) 
{ 
    return ""; 
} 

type of breturn type of OneMethod이 일치하지 않는주의하시기 바랍니다. 그럼에도 불구하고 런타임시 예외를 생성하고 throw합니다. 제 질문은 컴파일러가 왜 이것을 허용합니까? 아니면 이것의 철학은 무엇입니까?

이유는 Compiler does not know which OneMethod would be called, because a is dynamic. 일 수 있습니다. 그러나 왜 단지 OneMethod인지 알 수 없습니다. 런타임에는 예외가 반드시있을 것입니다.

+9

[MSDN] (http://msdn.microsoft.com/en-us/library/dd264741.aspx) (첫 번째 문장) 읽기 : _ "동적 유형은 발생하는 작업을 ** 컴파일을 우회 할 수있게합니다 런타임 유형 검사 ** 대신 런타임에 이러한 작업이 해결됩니다. "_ –

+0

@TimSchmelter 감사합니다. 사실 MSDN에서 검색하지 않았습니다. 그러나 나의 질문은 이것 뒤에 이유 (또는 철학)가 무엇인가라는 것이었다. – serdar

+3

당신은 E.Lippert에게 물어봐야 할 것 같습니다. "동적 인 경우 컴파일러가 더 이상 변수 또는 관련된 표현식을 검사 할 책임이 없습니다"와 같은 답변을 할 것입니다. –

답변

3

동적 유형의 피연산자가있는 표현식에는 동적 유형이 있습니다.

따라서 당신의 표현은 OneMethod(a)이 합리적인 이유 때문에 코드의 첫 번째 부분은 귀하의 케이스가 있는지 여부에 따라도에서 주장의

static void Main() 
{ 
    dynamic a = 1; 
    dynamic temp = OneMethod(a); 
    int b = temp; 
} 

방법 중 하나에 해당

동적으로 입력 된 것 개체를 반환 또는 당신은 아래의 메서드를 추가 할 때 컴파일러가 특정 줄에 대한 동작을 변경해야한다고 생각하지 않습니다.

private static T OneMethod<T>(T number) 

이제 컴파일러는 런타임까지 반환 된 유형을 알 수 없습니다. 어떤 메소드가 호출되는지조차 알지 못합니다. 제네릭 또는 제네릭이 아닌 첫 번째 경우에 할당을 컴파일 오류로 표시 한 다음 전혀 다른 방법을 추가하여 런타임 오류로 이동하면 놀라지 않을까요?

+1

하지만 'aMem'의 리턴 타입을 바꾸는 값은 무엇일까? –

+0

@JensKloster는 편집을 참조하십시오. 일반적으로 컴파일러는 반환되는 타입을 알 수 없다. 왜냐하면 컴파일러는 처음부터 올바른 메소드를 선택해야하기 때문이다. 그러나 그것을하기 위해서는 컴파일러가 관심을 가지지 않기 때문에 (즉, 타입을 동적으로 선언함으로써) 인수의 타입을 알 필요가 있습니다. –

+0

@RuneFS : 소스가 있습니까 설명서 또는 C# 사양) 첫 문장을 확인합니까? –

관련 문제