首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我不明白达特里的“空”是什么

我不明白达特里的“空”是什么
EN

Stack Overflow用户
提问于 2014-01-01 16:34:55
回答 2查看 3.4K关注 0票数 4

我不明白Null在Dart是什么。

在C#语言中,null是一个文字。null是引用类型变量的默认值。

null in C#没有任何类型。不可能通过点null访问.的成员。

示例:

代码语言:javascript
复制
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中工作?

代码语言:javascript
复制
// How the `null` value with type of `Null`
// can be assigned to a `String` type?
String s = null;

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

代码语言:javascript
复制
"Tests for null should be done with '== null'".
print(s is NUll);

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

为什么这个奇怪的警告在省道编辑?

我想测试如何工作Dart类型的系统,但编辑器给我这条消息。

我不理解它,因为我无法理解Null类型是如何同时出现的:

  1. 可以是所有类型的子类型。
  2. 不能是所有类型的子类型。

我欢迎开发人员的回答。

是否有任何与面向对象编程( Dart语言规范中没有记录的)相反的魔术,即如何将不兼容类型假定为兼容类型?

附注:

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

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

这是我说话的证据。

代码语言:javascript
复制
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类型。

代码语言:javascript
复制
print(null.runtimeType == Null);
代码语言:javascript
复制
true

附注:

我不明白为何有些人不明白问题,而导致矛盾的例子。

代码语言:javascript
复制
The static type of null is bottom.

不对。null类型是Null类型,而不是bottom类型。

我已经给出了证据

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

附注:

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

或者可能是对手不是开发人员?

或者可能是Dart运行时没有遵循语言规范,反对者相信(或者不知道?)这条规则没有得到遵守吗?

我认为null必须具有_Null类型,而不是在源代码中声明,而是在created internally in virtual machine中声明。

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

谁是对的?我还是你?

EN

回答 2

Stack Overflow用户

发布于 2014-01-01 17:17:03

来自spec

空 保留字null表示空对象。 nullLiteral:空 ; 空对象是内置类Null的唯一实例。试图实例化Null会导致运行时错误。类试图扩展或实现Null是编译时错误。调用空方法将产生一个NoSuchMethodError,除非该方法是由类Null显式实现的。 静态类型的null是底部。 使用底部代替Null的决定允许在任何地方都分配null,静态检查器没有抱怨。

底端记录不清,我找不到太多的参考资料。但是,当规范讨论void时,会提到:

底部是所有类型的子类型。

因此,为了回答您的问题,看来Null类型并没有什么神奇之处,但是null文字有魔力;它有一种底部类型,这意味着它是所有类型的子类型。

由于nullNull的唯一实例,所以检查是否为== null而不是is Null更正确,我认为这就是为什么从编辑器那里得到警告的原因。

票数 8
EN

Stack Overflow用户

发布于 2014-01-01 17:15:12

NullObject的一个子类型,因为Dart是一种动态语言,所以将null (Null的一个实例)赋值给String类型的变量或任何其他类型都是有效的。静态类型检查必须有一个特殊规则,以避免为将null分配给另一个类型的变量而产生错误或警告。

检查s is Null的结果到true,但Dart风格的指南似乎强制s == null的原因未知(也许它更快)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20870712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档