我不了解 Dart 中的 Null
是什么意思。
在 C# 语言中,null
是一个字面量。 null
是引用类型变量的默认值。
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.不是所有类型的子类型
期待开发者的回答。
是否存在与面向对象编程相反的魔法(在Dart语言规范中未记录)以确定不兼容类型为兼容类型?
附言:
Dart中的Null类型是完整的类,因此它是一个“常规类型”。
我没有找到官方文件说明相反的内容(即Null类型不是一个“常规”类型,而是一个“底部”类型)。
这里是我的声明证明。
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
附言:
我不明白为什么有些人不理解问题,还举出矛盾的例子。
The static type of null is bottom.
不正确。 null
的类型是 Null
类型,而不是 bottom
类型。
我已经提供了证据:
null.runtimeType == Null
,但不是bottom
类型Null
类不是bottom
类型(请查看 SDK 中的源代码)。
附言:
为什么所有这些答案都不能对应于实际情况(运行时)的结论?
或者说对手不是开发人员?
或者说 Dart 运行时不遵循语言规范,而对手认为(或不知道?)这条规则没有被遵守?
我认为 null
必须有一个类型为 _Null
的类型,在源代码中未声明,但在虚拟机中 创建内部
。
在这种情况下,我无法说 _Null
不是 bottom
类型,因为这是隐藏在虚拟机中的。
谁是正确的?我还是你?
null
的类是Null
,它的类型是bottom
。类和类型是完全不同的概念,它们之间没有任何关系。在面向对象编程中,类定义表示,而类型定义行为。 - Jörg W Mittagbottom
这种类型。 - Günter Zöchbauernull
不是bottom
的值(如编译时所假设的),而是Null
类型的值。在语言规范中,Null
并没有被描述为“bottom”类型(所有类型的子类型)。在实践中(参见源代码),Null
类被声明为常规类型。我不是在问编译过程,而是在问在运行时,如何将常规类型Null
的值分配给不兼容的类型? - mezoni