键入泛型方法的类型参数的推断

时间:2012-01-28 01:41:08

标签: c# generics types methods inference

我是Stack Overflow的新手,所以请放轻松我吧!我正在深入阅读C#,但我遇到了一个我不相信的情景。快速搜索网络也不会产生任何结果。

假设我定义了以下重载方法:

void AreEqual<T>(T expected, T actual)

void AreEqual(object expected, object actual)

如果我在没有指定类型参数的情况下调用AreEqual()

AreEqual("Hello", "Hello")

是否调用了该方法的通用版本或非泛型版本?是通过推断类型参数调用泛型方法,还是通过将方法参数隐式强制转换为System.Object来调用非泛型方法?

我希望我的问题很明确。提前感谢任何建议。

1 个答案:

答案 0 :(得分:5)

泛型可以生成函数AreEqual(string, string)。这是一个比AreEqual(object, object)更接近的匹配,因此选择了通用函数。

有趣的是,编译器将选择此通用函数,即使它导致约束违规错误。

看看这个例子:

using System.Diagnostics;

namespace ConsoleSandbox
{
    interface IBar
    {
    }

    class Program
    {
        static void Foo<T>(T obj1) where T: IBar
        {
            Trace.WriteLine("Inside Foo<T>");
        }


        static void Foo(object obj)
        {
            Trace.WriteLine("Inside Foo Object");
        }

        static void Main(string[] args)
        {

            Foo("Hello");
        }
    }
}

即使在这里,它也会选择非通用版本的通用版本。然后你得到这个错误:

  

类型'string'不能用作泛型中的类型参数'T'   类型或方法'ConsoleSandbox.Program.Foo(T)'。没有   从'string'到'ConsoleSandbox.IBar'的隐式引用转换。

但是如果添加一个函数Foo(string obj1),它将起作用。