9

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

        List<double> list1 = new List<double>();  // legal, C#
        double d0 = 3.0;
        list1.Add(d0);                            // legal, C#
        Double dd = 2.3f;                         // legal, C#
        list1.Add(dd);                            // legal, C#
        List<Double> list2 = new List<Double>();  // 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<double> list1 = new ArrayList<double>();  // illegal, Java
        List<Double> list2 = new ArrayList<Double>();  // legal, Java
        double d1 = 3.0;
        list2.add(d1);                                 // legal, Java
        list2.add(2.0);                                // legal, Java
        double d2 = list2.get(0);                      // legal, Java

我将不胜感激对差异和任何潜在理由的系统分析。

4

2 回答 2

20

在 C# 中,和完全double一样Double(只要您没有创建自己的名为 的类型,这将是愚蠢的)。Double

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

在 java 中,Double是一个 boxed double,类型擦除是泛型实现的关键部分。

于 2009-10-20T20:42:01.713 回答
10

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

在 Java 中,拳击是必要的。由于类型擦除,您无法创建List<double>, only List<Double>。在编译时,需要进行装箱/拆箱,以便您可以将本机类型变量添加到 aList<?>或将本机变量分配给 List 的元素。List<Object>List<Object>

于 2009-10-20T20:50:42.033 回答