当前位置: 首页 > 知识库问答 >
问题:

是什么使可为空的类型可以赋值为空?

傅涵忍
2023-03-14

我们知道我们可以将null赋给可为null的类型。例如:

Nullable<Int32> x = 2021;
Nullable<Int32> y = null;

我们知道第二种说法是有效的,因为有人告诉我们它是有效的,我们只是接受它,而不问为什么。但如果查看nullable 的源代码,则为:

public struct Nullable<T> where T : struct {
   ...
   public static implicit operator Nullable<T>(T value) {
      return new Nullable<T>(value);
   }
   public static explicit operator T(Nullable<T> value) {
      return value.Value; 
   }
}

我们可以将int赋给nullable nullable x=2021; 的原因是由于隐式运算符,它允许您隐式强制转换int为nullable 。根据隐式运算符的规则,t作为=的右手边,必须是结构类型,但null显然不是合法的结构值,那么如何做nullable y=null; (更不用说nullable 本身就是一个结构),为什么不违反隐式运算符规则

共有1个答案

燕琨
2023-03-14

检查null以及将null赋值给nullable 类型的变量是编译器显式覆盖的。

所以

int? i = ...
if (i == null) ...

转换为

if (i.HasValue)

而且

i = null;

转换为

i = default(Nullable<int>);

默认值(nullable ) 分配“空”(零初始化)nullable 。因此,它的hasvalue属性为false,这是int?null的语义等价物。

 类似资料:
  • 在Kotlin中,您可以创建: 然后可以使用它解析JSON,例如“{n:10}”。在这种情况下,您将有一个对象,从、或接收,它包含以下值:。 在Kotlin+GSON-How to get a emptyList when null for data类中,您可以看到另一个示例。 当您以后尝试使用时,您将在这里得到一个异常::“Kotlin.TypeCastException:null不能被强制转换

  • 在其他地方,我需要从中的内容创建一个。所以,我这样做: 此外,在这里使用进行一些转换,以便每次都用每一个小东西清理它,一方面为我提供编译时保证和安全性,但这在大多数情况下是一个大麻烦。有没有一些短手来绕过这些情况?

  • 我有返回给我一些JSON后端。 我将其解析为我的类: 然后我从服务器(使用rxJava)检索数据,没有任何错误。但是我预料到了一个错误,因为我认为我应该做这样的事情(以防止GSON转换器错误,因为在我的JSON响应中不存在): 在从后端接收数据并将其解析到带有构造函数的SomeData类(不带def值)之后,notNullableValue的值==NULL。 据我所知,在Kotlin中不是可空值可

  • 我在看Tomcat的Java源代码,发现了这样的代码 它编译成功,而通常赋值应该是 为什么第一段代码编译成功?

  • 为什么可选在线? 当可选值包含“nil”时,必须将可选类型“Int?”的值解包为“Int”类型的值,并使用“?”合并,以提供默认值,当可选值包含“nil”时使用“!”强制解包以中止执行 所以这修复了它: 如果我将其分解,则会在添加<code>let index</code>时发生更改。。。。 OK -这将返回first的总计数,total不是可选的: 确定-此枚举和总计不是可选的: 错误 - 这会

  • 问题内容: 访问主窗口时,它将作为 为什么它返回为double可选,这是什么意思?如果放入a中,我应该在其后添加一个? 尽管我的第一个建议是替换为after委托,但这不是解决方案。 问题答案: @matt有详细信息,但是有一个(有点可怕,有点很棒)的解决方法。(不过请参见下面的编辑) 我会将对这一行代码的理解留给读者作为练习。 好吧,我撒谎,让我们分解一下。 好的,到目前为止很好。在这一点上,我们