【发布时间】:2020-05-31 10:01:29
【问题描述】:
我的问题是:为什么从未调用过 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);
}
}
}
【问题讨论】:
-
您基本上希望
Add根据参数类型调用两种不同方法之一。简短的回答 - 编译器不会做你希望它做的事情。它在编译时选择最佳匹配 (AddData<T>) 并总是调用它。它这样做基本上是为了简单 - 因为它在编译时无法知道它是否会被string或int或其他什么调用。
标签: c# generics overloading