繁体   English   中英

通用接口实现 - 执行顺序

[英]Generic interface implementation - order of execution

我有以下通用接口

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); 版?

你打电话的原因

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

你有没有尝试过

ISerializer<BarcodeScannerModel> Serializer = new ...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM