Index: trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp
===================================================================
--- trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp	(revision 711)
+++ trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp	(revision 712)
@@ -618,7 +618,5 @@
 	char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE];
 	bool isError = false;
-
-	//レキシカルスコープをレベルアップ
-	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
+	std::string elementTypeName;
 
 	//第１パラメータを取得
@@ -635,5 +633,14 @@
 	lstrcpy( collectionVar, Parameter + i );
 
-	if( !GetVarType( variable, resultType, false ) )
+
+	Exception::TryCommand(); //Finallyで_System_ForeachEnumerator.Disposeするため
+
+	//Enumeratorの取得
+	sprintf(temporary,"_System_ForeachEnumerator=%s.GetEnumerator()", collectionVar );
+	OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
+
 	{
 		Type collectionType;
@@ -643,13 +650,14 @@
 			goto ErrorStep;
 		}
+		elementTypeName = collectionType.GetActualGenericType(0).GetClass().GetFullName();
+	}
+
+	if( !GetVarType( variable, resultType, false ) )
+	{
 
 		// 未定義の場合は自動的に定義する
-		sprintf(temporary,"%s=Nothing%c%c%s", variable, 1, ESC_AS, collectionType.GetActualGenericType(0).GetClass().GetFullName().c_str() );
+		sprintf(temporary,"%s=Nothing%c%c%s", variable, 1, ESC_AS, elementTypeName.c_str() );
 		OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
 	}
-
-	// Resetメソッドを呼び出す
-	sprintf( temporary, "%s.Reset()", collectionVar );
-	Compile( temporary );
 
 	//Continueアドレスのバックアップとセット
@@ -657,6 +665,5 @@
 
 	// MoveNextメソッドを呼び出す
-	sprintf( temporary, "%s.MoveNext()", collectionVar );
-	NumOpe(temporary,Type(),Type());
+	NumOpe("_System_ForeachEnumerator.MoveNext()",Type(),Type());
 
 	//pop eax
@@ -674,5 +681,5 @@
 	{
 		// Currentプロパティから現在の値を取得
-		sprintf( temporary, "%s=%s.Current", variable, collectionVar );
+		sprintf( temporary, "%s=_System_ForeachEnumerator.Current%c%c%s", variable, 1, ESC_AS, elementTypeName.c_str() );
 		Compile( temporary );
 	}
@@ -700,4 +707,9 @@
 	//jeジャンプ先のオフセット値
 	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//Disposeを呼んでTryスコープを終える
+	Exception::FinallyCommand();
+	Compile( "_System_ForeachEnumerator.Dispose()" );
+	Exception::EndTryCommand();
 
 	//Continueアドレスを復元
