2016-06-08 3 views
3

나는 다음과 같은 코드가 있습니다왜 C#은 'var'가 null인지 확인 할 수 있습니까?

List<IMessage> messageList = new List<IMessage>(); 

foreach(var msg in messageList) 
{ 
    if(msg != null) 
    { 

    } 
} 

어떻게이 varMSG null에 대한을 확인 할 수 있습니까? 컴파일러에서 varIMessage이고 int 또는 nullable이 아닌 다른 형식이 아니라고 알려줍니다.

예제를 MSDN에서 보면 암시 적으로 입력 된 변수에 초기 값 (이에 따라 선언이 명시 됨)이 제공됩니다. 필자의 경우에는 그다지 가치가 없지만 컴파일러는 아무런 문제가 없다. 컴파일러는 msg이 nullable인지 어떻게 알 수 있습니까?

+6

당신의'messageList'는'IMessage' 타입의 아이템리스트입니다. 그래서 컴파일러는'msg'의 실제 타입이'IMessage'라고 쉽게 추측 할 수 있습니다. 컴파일러가 타입을 추론 할 수 없다면, 당신은'var'을 사용할 수 없을 것입니다. 'var msg;'는 허용되지 않습니다. – stuartd

+0

'null'에 대한 값의 비교는 항상 허용됩니다. 컴파일러는 'msg'가'int' 인 경우 경고를 발행합니다. 왜냐하면 비교는 항상'true'이지만, 허용되지 않을 것입니다. –

+0

@ JeroenMostert 값 유형에 대해 'null'을 검사하면 경고 이상이 발생합니다. 네가하는 말을 잘 모르겠다. – Snoopy

답변

4

컴파일러는 정적으로 입력 되었기 때문에 msg이 null 인 것을 알고 있습니다. 정적 유형은 이름을 지정하지 않았더라도 IMessage입니다.

컴파일러 var위한 IMessage 치환

이유는 foreach (var identifier in collection)에 등장하고 collectionIEnumerable<IMessage>을 구현하는 유형의 표현이다.

모든 모양이 var 일 때 정적으로 대체되는 유형이 있습니다. (dynamic 일 수도 있지만 dynamic은 기본값이 아니며 정적 유형 유추 규칙에서 유추 할 수있는 경우에만 적용 할 수 있습니다.) 정적 유형 유추 규칙이 대체 할 고유 한 유형을 찾을 수없는 경우 var의 사용은 허용되지 않습니다.

0

컴파일러가 형식을 유추합니다. 당신이 말하는 기본적인 수준, 일 :

var x = "foo"; 

컴파일러는 표현의 오른쪽은 string 및 양수인 x 유형이라고 본다.

컴파일러가 foreach 문을 발견 할 때도 마찬가지입니다. 그것은 IEnumerable 유형 (귀하의 경우 IEnumerable<IMessage>)을 결정하고 msg 유형을 IMessage으로 지정합니다. 당신의 예에서

0

, 당신의 messageList은이 예제 IMessage에 자동으로 (목록에 포함 된 사람을 기대하는 항목의 유형을 알고

foreach (var m in messageList)

C# .NET을 수행 할 때, 따라서 유형 List<IMessage>이다 객체)를 컴파일하고 컴파일 할 때 var가 IMessage으로 변환 될 것이라고 추측합니다.

var 키워드는 문법적 설탕 일뿐 실제로는 형식이 아닙니다. (실제로 타입을 쓰지 않아도됩니다.)

0

var의 유형은 입니다. 컴파일시에는 항상입니다. 유형을 구문에서 추론 할 수없는 상황은 컴파일 타임 오류입니다.

이 경우 입력 된 IMessage 컬렉션을 반복하므로 컴파일러는 반복 변수의 유형이 IMessage이고 따라서 null을 사용할 수 있음을 알고 있습니다.

1

var은 매우 잘못된 것입니다.
var은 특정 데이터 유형이 인 변수를 프로그래머에게 알리지 않고 선언합니다. 당신이 실제로 선언 한 무엇

foreach (IMessage msg in messageList) 

입니다하지만 당신은 자신을 위해 그것을 해결해야합니다.

관련 문제