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

zek*_*eer 5 c# generics methods types inference

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

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

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

void AreEqual(object expected, object actual)
Run Code Online (Sandbox Code Playgroud)

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

AreEqual("Hello", "Hello")
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*erd 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是,如果你添加一个功能Foo(string obj1),它将起作用.