我是Stack Overflow的新手,所以请放轻松我吧!我正在深入阅读C#,但我遇到了一个我不相信的情景。快速搜索网络也不会产生任何结果。
假设我定义了以下重载方法:
void AreEqual<T>(T expected, T actual)
void AreEqual(object expected, object actual)
如果我在没有指定类型参数的情况下调用AreEqual()
:
AreEqual("Hello", "Hello")
是否调用了该方法的通用版本或非泛型版本?是通过推断类型参数调用泛型方法,还是通过将方法参数隐式强制转换为System.Object
来调用非泛型方法?
我希望我的问题很明确。提前感谢任何建议。
答案 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)
,它将起作用。