Index: /trunk/ab5.0/abdev/BasicCompiler32/Compile_Func.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler32/Compile_Func.cpp	(revision 448)
+++ /trunk/ab5.0/abdev/BasicCompiler32/Compile_Func.cpp	(revision 449)
@@ -436,19 +436,24 @@
 {
 	extern int cp;
+
+	const Parameters *pBaseParams = NULL;
+	const Type *pBaseReturnType = NULL;
+	if( baseType.IsProcPtr() )
+	{
+		// 左辺で関数ポインタを要求されているとき
+		const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()];
+		pBaseParams = &pTempProcPointer->Params();
+		pBaseReturnType = &pTempProcPointer->ReturnType();
+	}
+	else if( baseType.IsDelegate() )
+	{
+		// 左辺でデリゲートを要求されているとき
+		const Delegate *pTempDelegate = &baseType.GetClass().GetDelegate();
+		pBaseParams = &pTempDelegate->Params();
+		pBaseReturnType = &pTempDelegate->ReturnType();
+	}
+
 	const UserProc *pUserProc;
-
-	const Parameters *pBaseParams = NULL;
-	if( baseType.IsProcPtr() )
-	{
-		// 左辺で関数ポインタを要求されているとき
-		pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params();
-	}
-	else if( baseType.IsDelegate() )
-	{
-		// 左辺でデリゲートを要求されているとき
-		pBaseParams = &baseType.GetClass().GetDelegate().Params();
-	}
-
-	if( pBaseParams )
+	if( pBaseParams && pBaseReturnType )
 	{
 		//左辺の型にのっとり、オーバーロードを解決
@@ -464,15 +469,27 @@
 		pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() );
 
-		if( isCallOn && baseType.IsDelegate() )
+		if( isCallOn )
 		{
 			// コード生成を伴う場合はエラーチェックを行う
-			if( !pUserProc->Params().Equals( *pBaseParams )
-				|| !pUserProc->ReturnType().Equals( baseType.GetClass().GetDelegate().ReturnType() ) )
+
+			if( baseType.IsDelegate() )
 			{
-				if( baseType.IsDelegate() )
+				// デリゲート
+				// 共変戻り値、反変引数をサポート
+				if( !(
+					pBaseParams->Equals( pUserProc->Params(), true )
+					&& ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) )
+					) )
 				{
 					SetError(67, name, cp );
 				}
-				else
+			}
+			else
+			{
+				// 関数ポインタ
+				if( !(
+					pBaseParams->Equals( pUserProc->Params() )
+					&& pBaseReturnType->Equals( pUserProc->ReturnType() )
+					) )
 				{
 					SetError(66, name, cp );
Index: /trunk/ab5.0/abdev/BasicCompiler64/Compile_Func.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler64/Compile_Func.cpp	(revision 448)
+++ /trunk/ab5.0/abdev/BasicCompiler64/Compile_Func.cpp	(revision 449)
@@ -288,19 +288,24 @@
 {
 	extern int cp;
+
+	const Parameters *pBaseParams = NULL;
+	const Type *pBaseReturnType = NULL;
+	if( baseType.IsProcPtr() )
+	{
+		// 左辺で関数ポインタを要求されているとき
+		const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()];
+		pBaseParams = &pTempProcPointer->Params();
+		pBaseReturnType = &pTempProcPointer->ReturnType();
+	}
+	else if( baseType.IsDelegate() )
+	{
+		// 左辺でデリゲートを要求されているとき
+		const Delegate *pTempDelegate = &baseType.GetClass().GetDelegate();
+		pBaseParams = &pTempDelegate->Params();
+		pBaseReturnType = &pTempDelegate->ReturnType();
+	}
+
 	const UserProc *pUserProc;
-
-	const Parameters *pBaseParams = NULL;
-	if( baseType.IsProcPtr() )
-	{
-		// 左辺で関数ポインタを要求されているとき
-		pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params();
-	}
-	else if( baseType.IsDelegate() )
-	{
-		// 左辺でデリゲートを要求されているとき
-		pBaseParams = &baseType.GetClass().GetDelegate().Params();
-	}
-
-	if( pBaseParams )
+	if( pBaseParams && pBaseReturnType )
 	{
 		//左辺の型にのっとり、オーバーロードを解決
@@ -316,15 +321,27 @@
 		pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() );
 
-		if( isCallOn && baseType.IsDelegate() )
+		if( isCallOn )
 		{
 			// コード生成を伴う場合はエラーチェックを行う
-			if( !pUserProc->Params().Equals( *pBaseParams )
-				|| !pUserProc->ReturnType().Equals( baseType.GetClass().GetDelegate().ReturnType() ) )
+
+			if( baseType.IsDelegate() )
 			{
-				if( baseType.IsDelegate() )
+				// デリゲート
+				// 共変戻り値、反変引数をサポート
+				if( !(
+					pBaseParams->Equals( pUserProc->Params(), true )
+					&& ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) )
+					) )
 				{
 					SetError(67, name, cp );
 				}
-				else
+			}
+			else
+			{
+				// 関数ポインタ
+				if( !(
+					pBaseParams->Equals( pUserProc->Params() )
+					&& pBaseReturnType->Equals( pUserProc->ReturnType() )
+					) )
 				{
 					SetError(66, name, cp );
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/include/Delegate.h
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/include/Delegate.h	(revision 448)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/include/Delegate.h	(revision 449)
@@ -11,4 +11,7 @@
 {
 	friend Delegates;
+
+	// importされている名前空間
+	NamespaceScopesCollection importedNamespaces;
 
 	std::string paramStr;
@@ -26,10 +29,12 @@
 
 		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Procedure );
+		ar & BOOST_SERIALIZATION_NVP( importedNamespaces );
 		ar & BOOST_SERIALIZATION_NVP( dynamicParams );
 	}
 
 public:
-	Delegate( const NamespaceScopes &namespaceScopes, const std::string &name, Procedure::Kind procKind, const char *paramStr, const std::string &returnTypeName, int sourceIndex )
+	Delegate( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const std::string &name, Procedure::Kind procKind, const char *paramStr, const std::string &returnTypeName, int sourceIndex )
 		: Procedure( namespaceScopes, name, procKind, false )
+		, importedNamespaces( importedNamespaces )
 		, paramStr( paramStr )
 		, returnTypeName( returnTypeName )
Index: /trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp
===================================================================
--- /trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp	(revision 448)
+++ /trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp	(revision 449)
@@ -5,4 +5,7 @@
 void Delegate::RefleshParameterAndReturnType()
 {
+	compiler.GetNamespaceSupporter().SetImportedNamespaces( this->importedNamespaces );
+	compiler.GetNamespaceSupporter().SetLivingNamespaceScopes( this->GetNamespaceScopes() );
+
 	// パラメータを解析
 	params.Analyze( paramStr.c_str(), sourceIndex );
@@ -151,5 +154,5 @@
 			}
 
-			this->Put( new Delegate( namespaceScopes, name, procKind, paramStr, returnTypeName, nowLine ) );
+			this->Put( new Delegate( namespaceScopes, importedNamespaces, name, procKind, paramStr, returnTypeName, nowLine ) );
 		}
 	}
