Index: trunk/abdev/BasicCompiler32/Compile_Func.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/Compile_Func.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler32/Compile_Func.cpp	(revision 424)
@@ -452,5 +452,5 @@
 
 		//オーバーロードを解決
-		pUserProc=OverloadSolution( name, subs, *pBaseParams, Type() );
+		pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() );
 
 		if( isCallOn && baseType.IsDelegate() )
Index: trunk/abdev/BasicCompiler32/Compile_Statement.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/Compile_Statement.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler32/Compile_Statement.cpp	(revision 424)
@@ -1022,5 +1022,5 @@
 
 						//オーバーロードを解決
-						const UserProc *pUserProc = OverloadSolution("==",subs, params, NULL);
+						const UserProc *pUserProc = OverloadSolution( "==", subs, params, Type( DEF_BOOLEAN ), type1 );
 
 						delete params[0];
Index: trunk/abdev/BasicCompiler32/Compile_Var.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/Compile_Var.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler32/Compile_Var.cpp	(revision 424)
@@ -428,5 +428,5 @@
 				int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
 
-				// TODO: ベースオブジェクト（指定されていないときはObjectクラス）にセットする
+				// 制約クラス（指定されていないときはObjectクラス）にセットする
 				resultType.SetBasicType( DEF_OBJECT );
 
Index: trunk/abdev/BasicCompiler32/Opcode.h
===================================================================
--- trunk/abdev/BasicCompiler32/Opcode.h	(revision 423)
+++ trunk/abdev/BasicCompiler32/Opcode.h	(revision 424)
@@ -190,8 +190,8 @@
 
 private:
-	bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, bool &isErrored );
+	bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, const Type &leftType, const UserProc &userProc, bool &isErrored );
 public:
-	const UserProc *_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType = false );
-	const UserProc *OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType = false );
+	const UserProc *_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType );
+	const UserProc *OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType = false );
 
 	void ApplyDefaultParameters( const Parameters &params );
Index: trunk/abdev/BasicCompiler32/OperatorProc.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/OperatorProc.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler32/OperatorProc.cpp	(revision 424)
@@ -60,5 +60,5 @@
 	if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
 	else GetCalcName(idCalc,temporary);
-	const UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType );
+	const UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType, leftType );
 
 	if(!pUserProc){
Index: trunk/abdev/BasicCompiler_Common/Compile.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/Compile.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/Compile.cpp	(revision 424)
@@ -84,6 +84,15 @@
 // ジェネリクスのクラス型記述を分析
 ///////////////////////////////////////////////////
-void SplitGenericClassInstance( const char *fullName, char *className, Jenga::Common::Strings &typeParameters )
+void SplitGenericClassInstance( const char *fullName, char *className, Jenga::Common::Strings &typeParameters, bool isDefiningClass, Jenga::Common::Strings *pTypeParameterBaseClassNames )
 {
+	if( isDefiningClass )
+	{
+		if( !pTypeParameterBaseClassNames )
+		{
+			SetError();
+		}
+		pTypeParameterBaseClassNames->clear();
+	}
+
 	int i = 0;
 	typeParameters.clear();
@@ -109,6 +118,27 @@
 				SetError(1,NULL,cp);
 			}
-
 			typeParameters.push_back( temporary );
+
+			if( isDefiningClass )
+			{
+				// クラス定義中にこの関数が呼び出されたとき
+
+				if( fullName[i] == 1 && fullName[i+1] == ESC_AS )
+				{
+					// 型パラメータの制約クラスを取得
+					i += 2;
+					GetIdentifierToken( temporary, fullName, i );
+					if( temporary[0] == '\0' )
+					{
+						extern int cp;
+						SetError(1,NULL,cp);
+					}
+				}
+				else
+				{
+					temporary[0] = 0;
+				}
+				pTypeParameterBaseClassNames->push_back( temporary );
+			}
 
 			if( fullName[i] == ',' )
Index: trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 424)
@@ -194,8 +194,10 @@
 }
 
-int GetReturnType_OperatorProc(int idCalc,const Type &baseType,int *type,LONG_PTR *index_stack,int &sp){
-	//オーバーロードされたオペレータ関数の戻り値を取得
-	CClass *pobj_c;
-	pobj_c=(CClass *)index_stack[sp-2];
+int GetReturnType_OperatorProc(int idCalc,const Type &baseType,int *type_stack,LONG_PTR *index_stack,int &sp){
+	Type leftType( type_stack[sp-2], index_stack[sp-2] );
+	Type rightType( type_stack[sp-1] & (~FLAG_CAST), index_stack[sp-1] );
+
+	//オーバーロードされたオペレータ関数を呼び出す
+	const CClass *pobj_c = &leftType.GetClass();
 
 	std::vector<const UserProc *> subs;
@@ -221,5 +223,5 @@
 
 	if(bTwoTerm){
-		params.push_back( new Parameter( "", Type( type[sp-1], index_stack[sp-1] ) ) );
+		params.push_back( new Parameter( "", rightType ) );
 	}
 
@@ -229,5 +231,5 @@
 	if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
 	else GetCalcName(idCalc,temporary);
-	const UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType );
+	const UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType, leftType );
 
 	if(bTwoTerm){
@@ -246,5 +248,5 @@
 
 	sp--;
-	type[sp-1]=pUserProc->ReturnType().GetBasicType();
+	type_stack[sp-1]=pUserProc->ReturnType().GetBasicType();
 	index_stack[sp-1]=pUserProc->ReturnType().GetIndex();
 
Index: trunk/abdev/BasicCompiler_Common/Overload.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/Overload.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/Overload.cpp	(revision 424)
@@ -29,4 +29,5 @@
 		char MethodName[VN_SIZE];
 		if( !SplitMemberName( name, NULL, MethodName ) ) lstrcpy( MethodName, name );
+
 /*
 		//メソッドの場合は静的かどうかを調べる
@@ -40,6 +41,8 @@
 		pobj_parameter=new ParamImpl(Parameter);
 
+		Type leftType;
+		GetTermType( ObjectName, leftType );
 
-		const UserProc *pUserProc = pobj_parameter->OverloadSolution(name,subs);
+		const UserProc *pUserProc = pobj_parameter->OverloadSolution( name, subs, leftType );
 
 
@@ -54,5 +57,7 @@
 	std::vector<const UserProc *> &subs,
 	const Parameters &params,
-	const Type &returnType ){
+	const Type &returnType,
+	const Type &leftType )
+{
 
 		// オーバーロードの解決
@@ -67,5 +72,5 @@
 		}
 
-		const UserProc *pUserProc = pobj_Parameter->OverloadSolution(name,subs);
+		const UserProc *pUserProc = pobj_Parameter->OverloadSolution( name, subs, leftType);
 
 		delete pobj_Parameter;
Index: trunk/abdev/BasicCompiler_Common/ParamImpl.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/ParamImpl.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/ParamImpl.cpp	(revision 424)
@@ -107,5 +107,5 @@
 }
 
-bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, bool &isErrored ){
+bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, const Type &leftType, const UserProc &userProc, bool &isErrored ){
 	//パラメータを識別してオーバーロードを解決
 
@@ -124,4 +124,7 @@
 	for(int i=0;i<max;i++){
 		Parameter &param = *targetParms[i];
+
+		Type paramType( param );
+		ResolveFormalGenericTypeParameter( paramType, leftType, &userProc );
 
 		if( i >= ParmsNum ){
@@ -140,5 +143,5 @@
 
 			if( !NumOpe_GetType(Parms[i],
-				( level <= OVERLOAD_LEVEL3 )? nullParam : param,
+				( level <= OVERLOAD_LEVEL3 )? nullParam : paramType,
 				argType) )
 			{
@@ -151,10 +154,31 @@
 		}
 
-		if(argType.GetBasicType()!=param.GetBasicType()){
+		if( ( argType.IsObject() && paramType.IsObject() ) || argType.GetBasicType() == paramType.GetBasicType() )
+		{
+			if( argType.IsStruct() ){
+				if(argType.GetIndex()!=paramType.GetIndex()){
+					return false;
+				}
+			}
+			else if( argType.IsObject() ){
+				if( level == OVERLOAD_LEVEL0 ){
+					if( !paramType.GetClass().IsEquals( &argType.GetClass() ) ){
+						return false;
+					}
+				}
+				else{
+					if( !paramType.GetClass().IsEqualsOrSubClass( &argType.GetClass() ) ){
+						return false;
+					}
+				}
+			}
+		}
+		else
+		{
 			if( level == OVERLOAD_LEVEL0 || level == OVERLOAD_LEVEL1 || level==OVERLOAD_LEVEL4 ){
 				return false;
 			}
 			else if( level == OVERLOAD_LEVEL2 ){
-				if( !(argType.IsWhole() && param.IsWhole() && argType.GetBasicSize() == param.GetBasicSize() ) ){
+				if( !(argType.IsWhole() && paramType.IsWhole() && argType.GetBasicSize() == paramType.GetBasicSize() ) ){
 					// サイズ違い
 					return false;
@@ -163,10 +187,10 @@
 			else if( level == OVERLOAD_LEVEL3 || level==OVERLOAD_LEVEL5){
 				if(!(
-					argType.IsWhole()&&param.IsWhole()||
-					argType.IsReal()&&param.IsReal()
+					argType.IsWhole()&&paramType.IsWhole()||
+					argType.IsReal()&&paramType.IsReal()
 					)){
 						return false;
 				}
-				if( argType.IsPointer() || param.IsPointer() )
+				if( argType.IsPointer() || paramType.IsPointer() )
 				{
 					// ポインタ型の不整合は認めない
@@ -175,24 +199,5 @@
 			}
 			else if(level==OVERLOAD_LEVEL6){
-				if(argType.IsObject()||param.IsObject()) return false;
-			}
-		}
-		else{
-			if( NATURAL_TYPE(argType.GetBasicType())==DEF_STRUCT){
-				if(argType.GetIndex()!=param.GetIndex()){
-					return false;
-				}
-			}
-			else if( NATURAL_TYPE(argType.GetBasicType())==DEF_OBJECT ){
-				if( level == OVERLOAD_LEVEL0 ){
-					if( !param.GetClass().IsEquals( &argType.GetClass() ) ){
-						return false;
-					}
-				}
-				else{
-					if( !param.GetClass().IsEqualsOrSubClass( &argType.GetClass() ) ){
-						return false;
-					}
-				}
+				if(argType.IsObject()||paramType.IsObject()) return false;
 			}
 		}
@@ -209,5 +214,5 @@
 }
 
-const UserProc *ParamImpl::_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType ){
+const UserProc *ParamImpl::_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType ){
 	const UserProc *pUserProc = NULL;
 
@@ -218,5 +223,5 @@
 			bool isErrored = false;
 			bool isHit = false;
-			isHit = EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type(), isErrored );
+			isHit = EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type(), leftType, *pTempUserProc, isErrored );
 			if( isErrored )
 			{
@@ -239,5 +244,5 @@
 						trace_for_overload( "戻り値も比較するモードに切り替えてオーバーロード解決を試みる" );
 
-						return OverloadSolution(name,subs, true);
+						return OverloadSolution( name, subs, leftType, true);
 					}
 				}
@@ -278,10 +283,10 @@
 	return pUserProc;
 }
-const UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<const UserProc *> &subs, bool isEnabledReturnType ){
+const UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType ){
 	trace_for_overload( "" );
 	trace_for_overload( "■■■■■■■■■■■■■■■■■■" );
 	trace_for_overload( "■■■ オーバーロード解決(" << name << ")" );
 
-	const UserProc *result = _OverloadSolution( name, subs, isEnabledReturnType );
+	const UserProc *result = _OverloadSolution( name, subs, leftType, isEnabledReturnType );
 
 	trace_for_overload( "■■■ ここまで" );
Index: trunk/abdev/BasicCompiler_Common/common.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/common.h	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/common.h	(revision 424)
@@ -250,5 +250,6 @@
 	std::vector<const UserProc *> &subs,
 	const Parameters &params,
-	const Type &returnType );
+	const Type &returnType,
+	const Type &leftType );
 
 //Debug.cpp
@@ -382,5 +383,5 @@
 void GetCommandToken( char *token, const char *source, int &pos );
 void GetCustomToken( char *token, const char *source, int &pos, char delimitation, bool isEscapeSequence );
-void SplitGenericClassInstance( const char *fullName, char *className, Jenga::Common::Strings &typeParameters );
+void SplitGenericClassInstance( const char *fullName, char *className, Jenga::Common::Strings &typeParameters, bool isDefiningClass = false, Jenga::Common::Strings *pTypeParameterBaseClassNames = NULL );
 int JumpStatement(const char *source, int &pos);
 void Compile(void);
Index: trunk/abdev/BasicCompiler_Common/error.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/error.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/error.cpp	(revision 424)
@@ -463,6 +463,6 @@
 	if( varType.IsObject() || calcType.IsObject() )
 	{
-		//いずれかがオブジェクトの場合
-		if( varType.GetBasicType() != calcType.GetBasicType() )
+		//いずれかがオブジェクトではない場合
+		if( (!varType.IsObject()) || (!calcType.IsObject()) )
 		{
 			DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
Index: trunk/abdev/BasicCompiler_Common/include/Class.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/Class.h	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/include/Class.h	(revision 424)
@@ -290,4 +290,8 @@
 
 	// 型パラメータ
+	const GenericTypes &GetFormalGenericTypes() const
+	{
+		return formalGenericTypes;
+	}
 	void AddFormalGenericType( GenericType genericType )
 	{
Index: trunk/abdev/BasicCompiler_Common/include/Type.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/Type.h	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/include/Type.h	(revision 424)
@@ -247,4 +247,10 @@
 typedef std::vector<Type> Types;
 
+/*!
+@brief	ジェネリックな型を解決する
+@param	typeParameter ジェネリック型を指定する。ここに解決後の型が入る。
+		classType インスタンス化されているオブジェクトの型
+		pUserProc 現在コンパイル中の関数（ただしクラスメソッドのみ）
+*/
 void ResolveFormalGenericTypeParameter( Type &typeParameter, const Type &classType, const UserProc *pUserProc = NULL );
 
Index: trunk/abdev/BasicCompiler_Common/src/Class_Collect.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/Class_Collect.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/src/Class_Collect.cpp	(revision 424)
@@ -332,5 +332,6 @@
 			char className[VN_SIZE];
 			Jenga::Common::Strings typeParameters;
-			SplitGenericClassInstance( temporary, className, typeParameters );
+			Jenga::Common::Strings typeParameterBaseClassNames;
+			SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames );
 
 			CClass *pobj_c = const_cast<CClass *>( this->Find(namespaceScopes, className) );
@@ -353,7 +354,20 @@
 			/////////////////////////////////////////////////////////
 			// ☆★☆ ジェネリクスサポート ☆★☆
-			BOOST_FOREACH( const std::string &typeParameter, typeParameters )
-			{
-				pobj_c->AddFormalGenericType( GenericType( typeParameter, Type(DEF_OBJECT,*GetObjectClassPtr()) ) );
+			for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ )
+			{
+				Type baseType( DEF_OBJECT, *GetObjectClassPtr() );
+				if( typeParameterBaseClassNames[i2].size() )
+				{
+					if( !compiler.StringToType( typeParameterBaseClassNames[i2], baseType ) )
+					{
+						SetError(106,typeParameterBaseClassNames[i2],i);
+					}
+					else if( !baseType.IsObject() )
+					{
+						SetError(106,typeParameterBaseClassNames[i2],i);
+					}
+				}
+
+				pobj_c->AddFormalGenericType( GenericType( typeParameters[i2], baseType ) );
 			}
 			/////////////////////////////////////////////////////////
@@ -527,5 +541,6 @@
 			char className[VN_SIZE];
 			Jenga::Common::Strings typeParameters;
-			SplitGenericClassInstance( temporary, className, typeParameters );
+			Jenga::Common::Strings typeParameterBaseClassNames;
+			SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames );
 
 			CClass *pobj_c =  const_cast<CClass *>( this->Find(namespaceScopes, className) );
@@ -549,7 +564,20 @@
 			/////////////////////////////////////////////////////////
 			// ☆★☆ ジェネリクスサポート ☆★☆
-			BOOST_FOREACH( const std::string &typeParameter, typeParameters )
-			{
-				pobj_c->AddFormalGenericType( GenericType( typeParameter, Type(DEF_OBJECT,*GetObjectClassPtr()) ) );
+			for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ )
+			{
+				Type baseType( DEF_OBJECT, *GetObjectClassPtr() );
+				if( typeParameterBaseClassNames[i2].size() )
+				{
+					if( !compiler.StringToType( typeParameterBaseClassNames[i2], baseType ) )
+					{
+						SetError(106,typeParameterBaseClassNames[i2],i);
+					}
+					else if( !baseType.IsObject() )
+					{
+						SetError(106,typeParameterBaseClassNames[i2],i);
+					}
+				}
+
+				pobj_c->AddFormalGenericType( GenericType( typeParameters[i2], baseType ) );
 			}
 			/////////////////////////////////////////////////////////
Index: trunk/abdev/BasicCompiler_Common/src/Compiler.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/Compiler.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/src/Compiler.cpp	(revision 424)
@@ -155,5 +155,5 @@
 			// コンパイル中クラスにおけるジェネリクス用の型パラメータのとき
 			type.SetBasicType( DEF_TYPE_PARAMETER );
-			type.SetClassPtr( this->GetObjectModule().meta.GetClasses().GetObjectClassPtr() );
+			type.SetClassPtr( &this->pCompilingClass->GetFormalGenericTypes()[formalTypeIndex].GetType().GetClass() );
 			type.SetFormalTypeName( typeName );
 			type.SetFormalTypeIndex( formalTypeIndex );
Index: trunk/abdev/BasicCompiler_Common/src/Enum.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/Enum.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/src/Enum.cpp	(revision 424)
@@ -177,5 +177,5 @@
 		sprintf(buffer+length,"Class Enum %s\n",enumInfo.GetName().c_str());
 		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\tInherits EnumBase\n");
+		sprintf(buffer+length,"\tInherits EnumBase<%s>\n",enumInfo.GetName().c_str());
 		length+=lstrlen(buffer+length);
 		sprintf(buffer+length,"\tSub %s(value As Long,lpszName As LPSTR)\n",enumInfo.GetName().c_str());
@@ -211,70 +211,4 @@
 		}
 
-		sprintf(buffer+length,"\tFunction Operator or (enumBase As %s) As %s\n",enumInfo.GetName().c_str(),enumInfo.GetName().c_str());
-		length+=lstrlen(buffer+length);
-		sprintf(buffer+length,"\t\tReturn New %s(This.value or enumBase.value, \"custom\")\n",enumInfo.GetName().c_str());
-		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\tEnd Function\n");
-		length+=lstrlen(buffer+length);
-
-		sprintf(buffer+length,"\tFunction Operator and (enumBase As %s) As %s\n",enumInfo.GetName().c_str(),enumInfo.GetName().c_str());
-		length+=lstrlen(buffer+length);
-		sprintf(buffer+length,"\t\tReturn New %s(This.value and enumBase.value, \"custom\")\n",enumInfo.GetName().c_str());
-		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\tEnd Function\n");
-		length+=lstrlen(buffer+length);
-
-		/*
-		sprintf(buffer+length,"\tOverride Function ToString() As String\n",enumInfo.TypeName);
-		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\t\tSelect Case value\n");
-		length+=lstrlen(buffer+length);
-		for(i2=0;i2<enumInfo.iEnumMemberNum;i2++){
-			CEnumMember *member;
-			member=enumInfo.ppobj_EnumMember[i2];
-
-			sprintf(buffer+length,"\t\t\tCase %d\n",member->m_value);
-			length+=lstrlen(buffer+length);
-			sprintf(buffer+length,"\t\t\t\tReturn \"%s\"\n",member->m_name);
-			length+=lstrlen(buffer+length);
-		}
-		lstrcpy(buffer+length,"\t\tEnd Select\n");
-		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\tEnd Function\n");
-		length+=lstrlen(buffer+length);
-
-		
-		sprintf(buffer+length,"\tSub Operator= (ByRef value As %s)\n",enumInfo.TypeName);
-		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\t\tThis.Copy(ByVal VarPtr(value))\n");
-		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\tEnd Sub\n");
-		length+=lstrlen(buffer+length);
-
-		sprintf(buffer+length,"\tSub Operator= (ByRef value As String)\n",enumInfo.TypeName);
-		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\t\tSelect Case value\n");
-		length+=lstrlen(buffer+length);
-		for(i2=0;i2<enumInfo.iEnumMemberNum;i2++){
-			CEnumMember *member;
-			member=enumInfo.ppobj_EnumMember[i2];
-
-			sprintf(buffer+length,"\t\t\tCase \"%s\"\n",member->m_name);
-			length+=lstrlen(buffer+length);
-			sprintf(buffer+length,"\t\t\t\tThis=%s.%s\n",enumInfo.TypeName,member->m_name);
-			length+=lstrlen(buffer+length);
-		}
-		lstrcpy(buffer+length,"\t\tEnd Select\n");
-		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\tEnd Sub\n");
-		length+=lstrlen(buffer+length);
-
-		sprintf(buffer+length,"\tSub Operator= (value As Long)\n",enumInfo.TypeName);
-		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\t\tm_Value=value\n");
-		length+=lstrlen(buffer+length);
-		lstrcpy(buffer+length,"\tEnd Sub\n");
-		length+=lstrlen(buffer+length);*/
-
 		lstrcpy(buffer+length,"End Class\n");
 		length+=lstrlen(buffer+length);
Index: trunk/abdev/BasicCompiler_Common/src/Type.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/Type.cpp	(revision 423)
+++ trunk/abdev/BasicCompiler_Common/src/Type.cpp	(revision 424)
@@ -541,52 +541,53 @@
 void ResolveFormalGenericTypeParameter( Type &typeParameter, const Type &classType, const UserProc *pUserProc )
 {
+	if( !typeParameter.IsTypeParameter() )
+	{
+		// ジェネリックな型ではなかったとき
+		return;
+	}
+
 	/////////////////////////////////////////////////////////
 	// ☆★☆ ジェネリクスサポート ☆★☆
 
+	// ポインタレベルを抽出
+	int ptrLevel = PTR_LEVEL( typeParameter.GetBasicType() );
+
+	if( pUserProc )
+	{
+		if( classType.IsObject() )
+		{
+			// 基底クラスでの自己解決
+			const CClass *pClass = &classType.GetClass();
+			while( pClass->HasSuperClass() )
+			{
+				if( pUserProc->GetParentClassPtr() == &pClass->GetSuperClass() )
+				{
+					if( pClass->GetSuperClassActualTypeParameters().size() )
+					{
+						// TODO: 適切な形に実装し直す（暫定的にトップの型を持ってきている）
+						typeParameter = pClass->GetSuperClassActualTypeParameters()[0];
+					}
+				}
+				pClass = &pClass->GetSuperClass();
+			}
+		}
+	}
+
 	if( typeParameter.IsTypeParameter() )
 	{
-		// 型パラメータだったとき
-
-		// ポインタレベルを抽出
-		int ptrLevel = PTR_LEVEL( typeParameter.GetBasicType() );
-
-		if( pUserProc )
+		if( classType.HasActualGenericType() )
 		{
-			if( classType.IsObject() )
-			{
-				// 基底クラスでの自己解決
-				const CClass *pClass = &classType.GetClass();
-				while( pClass->HasSuperClass() )
-				{
-					if( pUserProc->GetParentClassPtr() == &pClass->GetSuperClass() )
-					{
-						if( pClass->GetSuperClassActualTypeParameters().size() )
-						{
-							// TODO: 適切な形に実装し直す（暫定的にトップの型を持ってきている）
-							typeParameter = pClass->GetSuperClassActualTypeParameters()[0];
-						}
-					}
-					pClass = &pClass->GetSuperClass();
-				}
-			}
-		}
-
-		if( typeParameter.IsTypeParameter() )
+			typeParameter = classType.GetActualGenericType( typeParameter.GetFormalTypeIndex() );
+		}
+		else
 		{
-			if( classType.HasActualGenericType() )
-			{
-				typeParameter = classType.GetActualGenericType( typeParameter.GetFormalTypeIndex() );
-			}
-			else
-			{
-				// TODO: ベースオブジェクト（指定されていないときはObjectクラス）にセットする
-				typeParameter.SetBasicType( DEF_OBJECT );
-			}
-		}
-
-		for( int i=0; i<ptrLevel; i++ )
-		{
-			typeParameter.PtrLevelUp();
-		}
+			// 制約クラス（指定されていないときはObjectクラス）にセットする
+			typeParameter.SetBasicType( DEF_OBJECT );
+		}
+	}
+
+	for( int i=0; i<ptrLevel; i++ )
+	{
+		typeParameter.PtrLevelUp();
 	}
 
