自动装箱和拆箱在Java和C#中表现不同

我手动将代码从Java(1.6)转换为C#,并发现原语(int和double)的行为有些困难。 在C#中,似乎几乎所有转换都是自动发生的

List list1 = new List(); // legal, C# double d0 = 3.0; list1.Add(d0); // legal, C# Double dd = 2.3f; // legal, C# list1.Add(dd); // legal, C# List list2 = new List(); // legal, C# double d1 = 3.0; list2.Add(d1); // legal, C# list2.Add(2.0); // legal, C# double d2 = list2.get(0); // legal, C# 

但在Java中只允许一些

  List list1 = new ArrayList(); // illegal, Java List list2 = new ArrayList(); // legal, Java double d1 = 3.0; list2.add(d1); // legal, Java list2.add(2.0); // legal, Java double d2 = list2.get(0); // legal, Java 

我要感谢系统分析差异和任何基本原理。

在您的C#示例中,没有发生装箱或拆箱(和自动装箱)。 double只是struct Double的别名。

在Java中,拳击是必要的。 由于类型擦除 ,您无法创建List ,只能创建List 。 在编译时, List变为List并且需要进行装箱/取消装箱,以便您可以将本机类型变量添加到List或将本机变量分配给List的元素。

在C#中, doubleDouble 完全相同 (只要你没有创建自己的类型Double ,这将是愚蠢的)。

double定义global::System.Double的别名。 因此,这里没有拳击。

在java中, Double是一个盒装double精度型,其中类型擦除是generics实现的关键部分。