Index: /trunk/ab5.0/abdev/BasicCompiler32/OperatorProc.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler32/OperatorProc.cpp	(revision 447)
+++ /trunk/ab5.0/abdev/BasicCompiler32/OperatorProc.cpp	(revision 448)
@@ -82,5 +82,5 @@
 			*pUserProc->Params()[i],
 			*params[i],
-			"",
+			NULL,
 			i);
 	}
Index: /trunk/ab5.0/abdev/BasicCompiler64/OperatorProc.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler64/OperatorProc.cpp	(revision 447)
+++ /trunk/ab5.0/abdev/BasicCompiler64/OperatorProc.cpp	(revision 448)
@@ -88,5 +88,5 @@
 			*pUserProc->Params()[i],
 			*params[i],
-			"",
+			NULL,
 			i);
 	}
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/error.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/error.cpp	(revision 447)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/error.cpp	(revision 448)
@@ -470,9 +470,25 @@
 		}
 
-		if( !varType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) )
-		{
-			//等しくなく、派生クラスでもないとき
-			DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
-			return false;
+		if( varType.IsDelegate() && calcType.IsDelegate() )
+		{
+			// デリゲート同士の比較の場合
+			// ※共変戻り値及び反辺引数をサポートすること
+			if( !varType.GetClass().GetDelegate().IsSimilar( calcType.GetClass().GetDelegate() ) )
+			{
+				// 等しいと見なされないとき
+				DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
+				return false;
+			}
+		}
+		else
+		{
+			// 一般的なクラスの比較の場合
+
+			if( !varType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) )
+			{
+				//等しくなく、派生クラスでもないとき
+				DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
+				return false;
+			}
 		}
 	}
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/include/Delegate.h
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/include/Delegate.h	(revision 447)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/include/Delegate.h	(revision 448)
@@ -52,4 +52,10 @@
 		return dynamicParams;
 	}
+
+	/*!
+	@brief	オーバーライド用にデリゲート同士が等しいかどうかをチェックする
+	@param	dgt 照らし合わせるデリゲート
+	*/
+	bool IsSimilar( const Delegate &dgt ) const;
 };
 
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/include/Parameter.h
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/include/Parameter.h	(revision 447)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/include/Parameter.h	(revision 448)
@@ -84,6 +84,6 @@
 	}
 
-	bool Equals( const Parameter &param ) const;
-	bool Equals( const Types &actualTypeParametersForThisProc, const Parameter &param ) const;
+	bool Equals( const Parameter &param, bool isContravariant ) const;
+	bool Equals( const Types &actualTypeParametersForThisProc, const Parameter &param, bool isContravariant ) const;
 };
 
@@ -102,6 +102,6 @@
 public:
 
-	bool Equals( const Parameters &params ) const;
-	bool Equals( const Types &actualTypeParametersForThisProc, const Parameters &params ) const;
+	bool Equals( const Parameters &params, bool isContravariant = false ) const;
+	bool Equals( const Types &actualTypeParametersForThisProc, const Parameters &params, bool isContravariant = false ) const;
 
 	int GetMemorySize() const
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/include/Type.h
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/include/Type.h	(revision 447)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/include/Type.h	(revision 448)
@@ -154,4 +154,5 @@
 	bool Equals( const Type &type ) const;
 	bool IsCovariant( const Type &type ) const;
+	bool IsContravariant( const Type &type ) const;
 
 	int GetBasicSize() const;
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp	(revision 447)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp	(revision 448)
@@ -20,4 +20,22 @@
 		}
 	}
+}
+
+bool Delegate::IsSimilar( const Delegate &dgt ) const
+{
+	if( this->Params().Equals( dgt.Params(), true ) )			// パラメータが等しい、もしくは反変
+	{
+		if( this->returnType.Equals( dgt.returnType ) )
+		{
+			// 戻り値が等しい
+			return true;
+		}
+		else if( this->returnType.IsCovariant( dgt.returnType ) )
+		{
+			// 戻り値が共変
+			return true;
+		}
+	}
+	return false;
 }
 
@@ -149,4 +167,10 @@
 		const Delegate &dg = *this->Iterator_GetNext();
 
+		if( !dg.isTargetObjectModule )
+		{
+			// 静的リンクライブラリの場合は飛ばす（既にインスタンスが定義済みであるため）
+			continue;
+		}
+
 		std::map<std::string,std::string> values;
 
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/src/Meta.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/src/Meta.cpp	(revision 447)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/src/Meta.cpp	(revision 448)
@@ -152,3 +152,13 @@
 	}
 	meta.procPointers.PullOutAll();
+
+	// デリゲート
+	meta.GetDelegates().Iterator_Reset();
+	while( meta.GetDelegates().Iterator_HasNext() )
+	{
+		Delegate *pDelegate = meta.GetDelegates().Iterator_GetNext();
+		pDelegate->isTargetObjectModule = false;
+		this->GetDelegates().Put( pDelegate );
+	}
+	meta.GetDelegates().PullOutAll();
 }
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/src/Parameter.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/src/Parameter.cpp	(revision 447)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/src/Parameter.cpp	(revision 448)
@@ -2,5 +2,5 @@
 
 
-bool Parameter::Equals( const Parameter &param ) const
+bool Parameter::Equals( const Parameter &param, bool isContravariant ) const
 {
 	if( Type::Equals( param ) )
@@ -25,9 +25,19 @@
 	}
 
+	if( isContravariant )
+	{
+		// 反変引数を許可する
+		if( this->IsContravariant( param ) )
+		{
+			// 反変引数だったとき
+			return true;
+		}
+	}
+
 	return false;
 }
-bool Parameter::Equals( const Types &actualTypeParametersForThisProc, const Parameter &param ) const
-{
-	if( Equals( param ) )
+bool Parameter::Equals( const Types &actualTypeParametersForThisProc, const Parameter &param, bool isContravariant ) const
+{
+	if( Equals( param, isContravariant ) )
 	{
 		return true;
@@ -47,5 +57,5 @@
 }
 
-bool Parameters::Equals( const Parameters &params ) const
+bool Parameters::Equals( const Parameters &params, bool isContravariant ) const
 {
 	if( this->size() != params.size() ){
@@ -55,5 +65,5 @@
 	int max = (int)this->size();
 	for( int i=0; i<max; i++ ){
-		if( !(*this)[i]->Equals( *params[i] ) ){
+		if( !(*this)[i]->Equals( *params[i], isContravariant ) ){
 			return false;
 		}
@@ -62,5 +72,5 @@
 	return true;
 }
-bool Parameters::Equals( const Types &actualTypeParametersForThisProc, const Parameters &params ) const
+bool Parameters::Equals( const Types &actualTypeParametersForThisProc, const Parameters &params, bool isContravariant ) const
 {
 	if( this->size() != params.size() ){
@@ -70,5 +80,5 @@
 	int max = (int)this->size();
 	for( int i=0; i<max; i++ ){
-		if( !(*this)[i]->Equals( actualTypeParametersForThisProc, *params[i] ) ){
+		if( !(*this)[i]->Equals( actualTypeParametersForThisProc, *params[i], isContravariant ) ){
 			return false;
 		}
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp	(revision 447)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp	(revision 448)
@@ -161,4 +161,14 @@
 
 	return this->GetClass().IsSubClass( &type.GetClass() );
+}
+bool Type::IsContravariant( const Type &type ) const
+{
+	if( !this->IsObject() || !type.IsObject() )
+	{
+		// 反変性の判別はクラス型のみ
+		return false;
+	}
+
+	return type.GetClass().IsSubClass( &this->GetClass() );
 }
 
