c# - 永远不会调用带有字符串参数的重载方法,而是调用带有对象参数的方法

标签 c# overloading

我不明白为什么方法 Value(string s)从不要求元素 的 List<string>当列表传递到 ToString<M>(List<M> list) 时方法。下面是我从 LinqPad 中提取的测试代码。

我可以毫无问题地调用适当的 Value()遍历 ToString<M>(List<M> list) 之外的列表时的方法方法。

谢谢!

void Main()
{
    var list1 = new List<string>{"one","two","three"};
    var list2 = new List<object>{1,2,3};
    var list3 = new List<long>{1,2,3};
    "Strings".Dump();
    ToString<string>(list1);
    //list1.ForEach(i=> Value(i)); // proper overload of Value() is called 
    "Objects".Dump();
    ToString<object>(list2);
    //list2.ForEach(i=> Value(i));
    "Longs".Dump();
    ToString<long>(list3);
    //list3.ForEach(i=> Value(i));
}

public static string ToString<M>(List<M> list) 
{

    var sb = new StringBuilder();
    foreach(M i in list)
    {
        sb.AppendFormat("{0},", Value(i));
    }
    var str = sb.ToString();
    str.Dump();
    return str;
}


public static string Value(string s)
{
    "String".Dump();
    return "'" + s + "'";
}

// Define other methods and classes here
public static string Value(object o)
{
    "Object".Dump();
    return o.ToString();
}

这是输出。它表明 Value(string s) 从未被调用

Strings
Object
Object
Object
one,two,three,
Objects
Object
Object
Object
1,2,3,
Longs
Object
Object
Object
1,2,3,

最佳答案

因为绑定(bind)到 Value()ToString<M>在编译时完成。由于 M 没有限制,它能找到的最佳重载是 Value(object) .

为了绑定(bind)到Value(string)您必须将参数转换为 string或制作i dynamic在你的foreach循环:

foreach(dynamic i in list)
{
    sb.AppendFormat("{0},", Value(i));
}

然后将绑定(bind) Value(i) 在运行时 然后将选择是否使用 stringobject过载。

关于c# - 永远不会调用带有字符串参数的重载方法,而是调用带有对象参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21008120/

相关文章:

c# - 非静态类中的静态方法有什么意义?

c# - 通过 COM 将复杂信息从 Delphi 代码传递到 C#

c# - List<>.OrderBy() 是否检查列表是否已排序?

c++ - 在不分配新内存的情况下使用指针调用重载

c# - 在类定义中强制偏好重载?

c# - 我可以让 StreamReader.EndOfStream 在第一次读取文件后返回 false 吗?

c# - WebAPI [授权] 属性。这里发生了什么?

c++ - 正确声明模板参数 - 显式特化函数定义时的参数

ruby - 重载 Ruby 的 [...] 数组创建速记

C++ 重载 <<(非静态成员的无效使用)