Index: BasicCompiler32/Compile_Calc.cpp
===================================================================
--- BasicCompiler32/Compile_Calc.cpp	(revision 124)
+++ BasicCompiler32/Compile_Calc.cpp	(revision 128)
@@ -619,4 +619,23 @@
 
 
+	if( varType.IsObject() && Smoothie::Meta::blittableTypes.IsExist( calcType ) ){
+		// Blittable型をオブジェクトとして扱う
+		vector<UserProc *> userProcs;
+		Smoothie::Meta::blittableTypes.GetClass( calcType ).EnumStaticMethod( "_Create", userProcs );
+		if( userProcs.size() != 1 ){
+			SetError();
+			return;
+		}
+		UserProc *pUserProc = userProcs[0];
+
+		// call System.[TypeClass]._Create
+		op_call( pUserProc );
+
+		// push eax
+		op_push( REG_EAX );
+
+		calcType = pUserProc->ReturnType();
+	}
+
 
 	/////////////////////////////////
Index: BasicCompiler32/Compile_Statement.cpp
===================================================================
--- BasicCompiler32/Compile_Statement.cpp	(revision 124)
+++ BasicCompiler32/Compile_Statement.cpp	(revision 128)
@@ -90,6 +90,5 @@
 	bool isLiteral;
 	BOOL bUseHeap;
-	bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, &bUseHeap, NULL, true );
-
+	bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, &bUseHeap, false, NULL, true );
 	if( result ){
 
Index: BasicCompiler32/NumOpe.cpp
===================================================================
--- BasicCompiler32/NumOpe.cpp	(revision 124)
+++ BasicCompiler32/NumOpe.cpp	(revision 128)
@@ -227,5 +227,5 @@
 	return false;
 }
-bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName, bool isProcedureCallOnly ){
+bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool isWantObject, bool *pIsClassName, bool isProcedureCallOnly ){
 	char parameter[VN_SIZE];
 
@@ -255,5 +255,17 @@
 		bool isClassName = false;
 		Type leftType;
-		if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, &isClassName ) ){
+		if( GetTermType( termLeft, leftType, isLiteral, &isClassName ) ){
+			if( isClassName == false && Smoothie::Meta::blittableTypes.IsExist( leftType ) ){
+				// 左側のオブジェクト部分がBlittable型のとき
+
+				char temporary[VN_SIZE];
+				lstrcpy( temporary, termLeft );
+				sprintf( termLeft, "%s(%s)",
+					Smoothie::Meta::blittableTypes.Find( leftType ).GetCreateStaticMethodFullName().c_str(),
+					temporary );
+			}
+		}
+
+		if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, true, &isClassName ) ){
 			goto globalArea;
 		}
Index: BasicCompiler32/Opcode.h
===================================================================
--- BasicCompiler32/Opcode.h	(revision 124)
+++ BasicCompiler32/Opcode.h	(revision 128)
@@ -102,5 +102,13 @@
 //NumOpe.cpp
 void PushReturnValue(int type);
-bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName = NULL, bool isProcedureCallOnly = false );
+bool TermOpe(
+			 const char *term,
+			 const Type &baseType,
+			 Type &resultType,
+			 bool &isLiteral,
+			 BOOL *pbUseHeap,
+			 bool isWantObject = false,
+			 bool *pIsClassName = NULL,
+			 bool isProcedureCallOnly = false );
 bool NumOpe( int reg,
 			const char *expression,
