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?
我希望我的问题很明确.提前感谢任何建议.
泛型可以生成函数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),它将起作用.