C#泛型序列化困境

C#泛型序列化困境文章来源地址:https://www.yii666.com/article/754286.html

  问题的起因是这样,有一个需求,将JsonArray转化为List,JsonArray中的元素均是string,此string可被转化为int、float、或维持string。我的方案是扩展System.Collection.Generic.List<T>,实现一个void ParseFromJsonArray(JsonArray jsArray)方法,用于将JsonArray反序列为化List<T>。按此设计思路的代码应该像下面这样。文章来源地址https://www.yii666.com/article/754286.html网址:yii666.com<

  C#泛型序列化困境 图一

  然后使用上应该像下面这样,可以将一个array序列化为List。

  C#泛型序列化困境 图二

  可上述看似良好的设计却无法实现,错误原因在于Add()方法。一个List<T>的Add方法实际上是Add<T>()。所以图1中的三个Add调用实际上是像下述这样的调用。

  C#泛型序列化困境 图三

  编译器无法将Int、Float、String转化为T。所以上述代码无法编译通过。上述就是C#泛型坑爹之处,理论上对于List<int>调用ParseFromJsonArray,这是一个确定的类型List<int>,ParseFromJsonArray将JsonArray的内容解析为int即可,可编译器在编译ParseFromJsonArray时是在编译期,编译器只认T而对具体类型(运行时类型)int一无所知,而int无法转换为T从而导致编译错误。

  所以上述设计的问题在于运行时需求与编译期行为的矛盾。如果这是C++,非常好解决,使用特化模板即可,针对int、float、string分别写一个特化函数,但是C#移除了C++中的特化模板语法,从而造成了本文的困境。

  笔者也尝试了使用约束来解决,但很遗憾,在C#中 where T : int 也是个编译器错误。从而类似C++特化模板的方法也行不通了。文章地址https://www.yii666.com/article/754286.html

最后的结论,就是在目前的C#版本中,上述由List<T>来解析出具体类型从而Add()的功能无法实现。网址:yii666.com

版权声明:本文内容来源于网络,版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。文本页已经标记具体来源原文地址,请点击原文查看来源网址,站内文章以及资源内容站长不承诺其正确性,如侵犯了您的权益,请联系站长如有侵权请联系站长,将立刻删除

C#泛型序列化困境-相关文章

  1. 记 fastjson泛型转对象 第一次可以正常转,第二次就变成JSONArray 问题

  2. 从fastjson多层泛型嵌套解析,看jdk泛型推断

  3. C#泛型序列化困境

  4. 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的

    数组和泛型容器有什么区别要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance)、逆变性(contravariance)和无关性(invariant)。若类A是类B的子类,则记作A ≦ B。设有变换f(),若:在Java中,数组具有协变性,而泛型具有无关性,示例代码如下:这两句代

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信图片_20190322181744_03.jpg

微信扫一扫打赏

请作者喝杯咖啡吧~

支付宝扫一扫领取红包,优惠每天领

二维码1

zhifubaohongbao.png

二维码2

zhifubaohongbao2.png