日期:2014-05-17  浏览次数:20883 次

函数模板编译时二义性问题
有个函数模板,和一个普通的重载函数,编译时出现如下错误:
The call is ambiguous between the following methods or properties: 
'Extensions.EventHandlerExtension.SafeRaise<Tasks.EventArguments.SpUpEvtArgs>(System.EventHandler<Tasks.EventArguments.SpUpEvtArgs>, object, Tasks.EventArguments.SpUpEvtArgs)'
and 
'Extensions.EventHandlerExtension.SafeRaise<Tasks.EventArguments.SpUpEvtArgs>(System.EventHandler<Tasks.EventArguments.SpUpEvtArgs>, object, Tasks.EventArguments.SpUpEvtArgs)'

函数模板类:
using System;
namespace Extensions
{
    public static class EventHandlerExtension
    {
        public static void SafeRaise<T>(this EventHandler<T> evt, object sender, T e) where T: EventArgs
        {
            EventHandler<T> eventHandler = evt; 

            if (eventHandler != null)
            {
                eventHandler(sender, e);
            }
        }

        public static void SafeRaise(this EventHandler evt, object sender, EventArgs e)
        {
            EventHandler eventHandler = evt; 

            if (eventHandler != null)
            {
                eventHandler(sender, e);
            }
        }
    }
}

调用该函数的地方:

namespace Tasks
{
    public abstract class Task
    {
        public event EventHandler<SpUpEvtArgs> SpUp;

        protected void RaiseSpUpEvt(int speed, string unit)
        {
            SpUp.SafeRaise(this, new SpUpEvtArgs(this, speed, unit));  //这行,报上述错误
        }
    }
}

哪位帮忙看看为什么就编译出错呢?实在是想不通.
网上搜索了,有的说是定义了两遍,但是grep了整个工程也就只有这两个函数定义。

------解决方案--------------------
关了VS,删除bin obj文件夹,打开,重新编译。

另外再耐心找找,你引用的库中有没有重命的。
------解决方案--------------------
光这几个代码看不出,第一段编译是没问题的
The call is ambiguous between the following methods or properties: 
看似方法和属性冲突