C# 可选引用类型

C# 可选引用类型,c#,scala,null,nullable,option,C#,Scala,Null,Nullable,Option,可能重复: 引用类型提供特殊值null表示“缺少值”。值类型没有这样的值,这就是C#引入可选值类型(以及它们的特殊语法)的原因 Scala的选项[T]有三个不同的“null”值:null、None和Some(null)。在安全性和可表达性方面,这种增加的复杂性究竟给我们带来了什么?什么时候使用哪个?好的Scala实际上只有一个空值:None。不要使用null(与现有Java代码向后兼容除外) 关于为什么选项[T]有用,有很多答案。例如:参见 简短版本: 它使签名的可选性质明确化。下面明确指出,

可能重复:

引用类型提供特殊值
null
表示“缺少值”。值类型没有这样的值,这就是C#引入可选值类型(以及它们的特殊语法)的原因


Scala的
选项[T]
有三个不同的“null”值:
null
None
Some(null)
。在安全性和可表达性方面,这种增加的复杂性究竟给我们带来了什么?什么时候使用哪个?

好的Scala实际上只有一个空值:
None
。不要使用
null
(与现有Java代码向后兼容除外)

关于为什么
选项[T]
有用,有很多答案。例如:参见

简短版本:

它使签名的可选性质明确化。下面明确指出,我们期望
t
可以为“null”:

您不必在操作之前进行空检查:
(i:Option[Int])=>i.map(+1)
无论
i
Some(5)
还是
None
,都可以正常工作,并保留
选项
包装器以指示输入可能是
None
(因此,输出也可能是
None

您可以使用其他
选项或集合轻松组合它们:

val a: Option[Int] = Some(1)
val b: Option[Int] = Some(6)
val c: Option[Int] = Some(5)
val d: Option[Int] = None
for(x <- a; y <- b; z <- c) yield x + y + z // Some(12)
for(x <- a; y <- d; z <- c) yield x + y + z // None
vala:Option[Int]=Some(1)
val b:选项[Int]=Some(6)
val c:选项[Int]=Some(5)
val d:选项[Int]=无
对于C#(通常在.NET框架中)中的(x),存在类型
Nullable
,它是一种值类型的包装器

Nullable<int> i = null;
if (i == null) ...
if (i.HasValue) { int k = i.Value; ... }


另一方面,还有可选参数。您必须定义这些参数的默认值。无法知道是否缺少这些参数。

“这就是为什么C#引入可选值类型的原因”这不是原因。这是为什么
Option
null
好的最好解释之一:我知道你发布答案已经三年了,但仅供参考,我在Scala 2.11.4 REPL::11中得到了以下信息:错误:类型不匹配;发现:List[Int],必需:Option[?],for(x fixed);它现在可以编译。
val a: Option[Int] = Some(1)
val b: Option[Int] = Some(6)
val c: Option[Int] = Some(5)
val d: Option[Int] = None
for(x <- a; y <- b; z <- c) yield x + y + z // Some(12)
for(x <- a; y <- d; z <- c) yield x + y + z // None
Nullable<int> i = null;
if (i == null) ...
if (i.HasValue) { int k = i.Value; ... }
int? i = null;