我无法理解Dart中的“Null”是什么

时间:2014-01-01 16:34:55

标签: c# oop scala dart type-systems

我无法理解Dart中的Null是什么。

在C#语言中null是一个文字。 null是reference-type变量的默认值。

C#中的null没有类型。无法通过点null访问.的成员。

示例:

String s = null; // the default value of reference-type variable
null.GetType(); // Operator '.'  cannot be applied to operand of the type <null>

在Dart中,null的类型为Null。但是Dart中Null类型的实例不是bottom类型。

根据类型继承在Dart中如何工作?

// How the `null` value with type of `Null`
// can be assigned to a `String` type?
String s = null;

此代码在Dart编辑器中产生奇怪的警告。

"Tests for null should be done with '== null'".
print(s is NUll);

但我不想要“null的测试”。我想测试Null。这不一样。

为什么Dart编辑器会出现这种奇怪的警告?

我想测试如何使用Dart类型系统但编辑器会给我这个消息。

我不明白,因为我无法理解Null同时输入的方式:

  1. 可以是所有类型的子类型
  2. 不能是所有类型的子类型
  3. 我欢迎开发人员的答案。

    是否存在与面向对象编程(Dart语言规范中未记录)相反的关于如何将不兼容类型视为兼容类型的魔法?

    P.S。

    Dart中的Null类型是完整的类,因此它是regular type

    我没有找到相反的官方文档(Null类型不是regular类型,但它是bottom类型)。

    这是我的话语证明。

    class Null {
      factory Null._uninstantiable() {
        throw new UnsupportedError('class Null cannot be instantiated');
      }
    
      /** Returns the string `"null"`. */
      String toString() => "null";
    }
    

    您可以看到Null不是bottom类型。

    您可以在此处看到null不是bottom类型,而是Null类型。

    print(null.runtimeType == Null);
    
    true
    

    P.S。

    我不明白为什么有些人不理解这些问题并导致矛盾的例子。

    The static type of null is bottom.
    

    不对。 null的类型为Null类型,但不是bottom类型。

    我已经证明了

    • null.runtimeType == Null但不是bottom类型
    • Null不是bottom类型(请参阅SDK中的源代码)。

    P.S。

    为什么所有这些答案都不符合现实(运行时)结论?

    或者可能是对手不是发展者?

    或者Dart运行时可能不遵循语言规范而且反对者相信(或不知道?)这条规则不受尊重?

    我认为null必须具有未在源代码中声明_Null的{​​{1}}类型。

    在这种情况下,我不能说created internally in virtual machine不是_Null类型,因为它隐藏在虚拟机中。

    谁对谁?我还是你?

2 个答案:

答案 0 :(得分:5)

来自spec

  

     

保留字null表示空对象。

     

nullLiteral:        空

     

     

null对象是内置类Null的唯一实例。   尝试实例化Null会导致运行时错误。它是一个   类的编译时错误,试图扩展或实现Null。   除非使用方法,否则在null上调用方法会产生NoSuchMethodError   由Null类显式实现。

     

静态类型为null。

     

使用bottom而不是Null的决定允许使用null   在没有静态检查员抱怨的情况下分配到处。

底部记录很少,我找不到太多的参考。但是,当规范讨论void时,会提到:

  

bottom是所有类型的子类型

所以,为了回答你的问题,似乎Null类型没有任何神奇之处,但是有一些神奇的文字正在进行;它有一种底部,这意味着它是所有类型的子类型。

由于nullNull的唯一实例,因此检查某些== null是否比is Null更为正确,我认为这是为什么你会从编辑。

答案 1 :(得分:1)

NullObject的子类型,而Dart是一种动态语言,将nullNull的实例)分配给String类型的变量或任何其他类型有效。 静态类型检查必须有一个特殊规则,不会产生错误或警告,以便将null分配给另一种类型的变量。

检查s is Null结果为true,但Dart风格指南似乎强制要求s == null,原因我不知道(可能更快)。