C#: 泛型参数与对象类型参数

3

我有两个重载的方法,一个期望接受对象类型的参数,另一个期望接受泛型参数列表。我试图理解在何时调用哪个函数。我传递了字符串对象,它调用了泛型参数方法。

class Program
{
    static void Main(string[] args)
    {
        string s = "string";
        Invoke(s);
        Console.ReadLine();
    }

    static void Invoke(object s)
    {
        Console.WriteLine("Object param invoked");
    }

    static void Invoke<T>(params T[] values)
    {
        Console.WriteLine("Params method invoked");
    }
}

输出结果为:“Params方法被调用”。

但我不确定为什么总是调用这个方法。我还尝试传递int参数,但params方法再次被调用。如果有人能为我解释一下,谢谢。


当您传递一个对象时会发生什么? - Zohar Peled
在检查重载时,最严格的重载首先被调用,即在此情况下,首先检查并调用 Invoke<string>(string value) - Cleptus
@bradbury9 在这种情况下,对象参数方法将在何时被调用? - Rana Mujahid
@RanaMujahid object s = "string"; Invoke(s); 可以实现此功能。 - user47589
谢谢@Amy...现在它被称为第一个方法。 - Rana Mujahid
1
当我将字符串对象传递给方法时,我可以说编译器将其读取为Invoke<string>,现在参数类型变为字符串?字符串比对象更具体。因此Params方法被调用。我是正确的吗? - Rana Mujahid
1个回答

5
简而言之,类型TObject更具体,因为Invoke<string>是一个有效的调用。

2
补充一下这个答案,编译器可以推断出类型参数;这就是为什么 OP 不需要写 Invoke<string>(s);。请参阅泛型文档 - Lews Therin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接