从泛型方法调用重载泛型方法



我的问题是:为什么AddData(string data)从不被召唤?当我调用ds.Add("Some text")时,data参数的类型在编译时是已知的,因此Add的重载实现应该调用AddData(string)方法(或者这就是我希望的(

输出为

Ignore data of type System.String
Ignore data of type System.Double
using System;
namespace GenericCall
{
interface IDataStore
{
void Add<T>(T data);
}
class MyDataStore : IDataStore
{
public void Add<T>(T data)
{
AddData(data);
}
private void AddData<T>(T data)
{
Console.WriteLine($"Ignore data of type {data.GetType()}");
}
private void AddData(string data)
{
Console.WriteLine("Accept string data");
}
}
class Program
{
static void Main(string[] args)
{
MyDataStore ds = new MyDataStore();
ds.Add("Some text");
ds.Add(3.14);
}
}
}

重载解析发生在代码的编译时。

在编译时,编译器不知道T实际上是什么,所以这个调用:

public void Add<T>(T data)
{
AddData(data); <------
}

只能解析到泛AddData,按照重载解析的规则。

在运行时进行重载解析的一种方法是使公共Add接受dynamic参数:

// you should change the interface declaration also!
public void Add(dynamic data)
{
AddData(data);
}

这将产生输出:

Accept string data
Ignore data of type System.Double

最新更新