通用接口实现 - 执行顺序

时间:2014-10-31 15:52:11

标签: c# generics inheritance

我有以下通用接口

public interface ISerializer<T>
{
    MemoryStream Serialize(IList<T> list);
    MemoryStream Serialize(T obj);
}

当我按如下方式实现界面时

 ISerializer<IList<BarcodeScannerModel>> Serializer = new Serializer<IList<BarcodeScannerModel>>();
 var memstream = Serializer.Serialize(list);

 object myObject = new object();
 ISerializer<object> Serializer = new Serializer<object>();
 var memStr = Serializer .Serialize(myObject);

两种实现都使用MemoryStream Serialize(T obj);

我的问题是为什么列表版本使用MemoryStream Serialize(T obj); 而不是Serialize(IList<T> list);版本?

2 个答案:

答案 0 :(得分:3)

您致电

的原因
var memstream = Serializer.Serialize(list);

正在调用

MemoryStream Serialize(T obj);

当泛型被“填写”时,你的界面“看起来像”(伪代码):

public interface ISerializer<IList<BarcodeScannerModel>>
{
    MemoryStream Serialize(IList<IList<BarcodeScannerModel>> list);
    MemoryStream Serialize(IList<BarcodeScannerModel> obj);
}

所以在将IList<BarcodeScannerModel>传递给Serialize()时,它会正确选择obj重载(请注意,这与正确的不相同)。


如果您想要打电话

MemoryStream Serialize(IList<T> list);

然后你需要定义你的serializer

ISerializer<BarcodeScannerModel> serializer = new Serializer<BarcodeScannerModel>();

基本上你正在加倍IList s

答案 1 :(得分:0)

你试过吗

ISerializer<BarcodeScannerModel> Serializer = new ...

我的猜测是因为你的接口方法是为List<T>定义的,同时你将List<Barcode...>作为T传递,你的实际参数不是预期的类型。