5

我是 Stack Overflow 的新手,所以请放轻松!我正在深入阅读 C#,但我遇到了一个我认为没有涵盖的场景。快速搜索网络也没有抛出任何结果。

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

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

void AreEqual(object expected, object actual)

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

AreEqual("Hello", "Hello")

调用的方法是通用版本还是非通用版本?是在推断类型参数的情况下调用泛型方法,还是通过隐式转换为的方法参数调用非泛型方法System.Object

我希望我的问题很清楚。提前感谢您的任何建议。

4

1 回答 1

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”不能用作泛型类型或方法“ConsoleSandbox.Program.Foo(T)”中的类型参数“T”。没有从“string”到“ConsoleSandbox.IBar”的隐式引用转换。

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

于 2012-01-28T01:51:02.457 回答