我无法理解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
同时输入的方式:
我欢迎开发人员的答案。
是否存在与面向对象编程(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
类型,因为它隐藏在虚拟机中。
答案 0 :(得分:5)
来自spec
空
保留字null表示空对象。
nullLiteral: 空
null对象是内置类Null的唯一实例。 尝试实例化Null会导致运行时错误。它是一个 类的编译时错误,试图扩展或实现Null。 除非使用方法,否则在null上调用方法会产生NoSuchMethodError 由Null类显式实现。
静态类型为null。
使用bottom而不是Null的决定允许使用null 在没有静态检查员抱怨的情况下分配到处。
底部记录很少,我找不到太多的参考。但是,当规范讨论void时,会提到:
bottom是所有类型的子类型
所以,为了回答你的问题,似乎Null类型没有任何神奇之处,但是有一些神奇的文字正在进行;它有一种底部,这意味着它是所有类型的子类型。
由于null
是Null
的唯一实例,因此检查某些== null
是否比is Null
更为正确,我认为这是为什么你会从编辑。
答案 1 :(得分:1)
Null
是Object
的子类型,而Dart是一种动态语言,将null
(Null
的实例)分配给String
类型的变量或任何其他类型有效。
静态类型检查必须有一个特殊规则,不会产生错误或警告,以便将null
分配给另一种类型的变量。
检查s is Null
结果为true
,但Dart风格指南似乎强制要求s == null
,原因我不知道(可能更快)。