Scala Option是否与C#Nullable类型相同?

时间:2016-07-07 18:01:51

标签: c# scala

在Scala中,您有Option[Int] Some(number)None,其属性isDefined在第一种情况下返回true并{{1}在另一个。

在C#中,您有false int?a number,其属性null在第一种情况下返回HasValue并{{1}在另一个。

Scala的true是否与C#的false相同,是否存在差异?

2 个答案:

答案 0 :(得分:5)

不,它根本不是一样的。除了其他答案:

  1. Scala有Option[Option[Int]]; C#没有int??

  2. Scala有Option[String]; C#没有string?

  3. 在C#中,存在从TT?的隐式转换;在Scala中,没有从TOption[T]的隐式转换(Scala允许您手动定义此类转换,但不建议这样做。)

  4. 这意味着Option?更多统一可组合,并且可以更广泛地使用它。例如。 Scala的Map[K, V].get(K)返回Option[V];但在.Net中,Dictionary<TKey, TValue>[TKey]无法返回TValue?,因为TValue可以是引用类型。即使是等价的Option.map,也需要为返回值类型和引用类型的函数分别实现。

    我还想重申,get应该避免! isDefined get未被// I successfully can open the solution and get the project I'd like to // modify the build options of (compiler and linker options) foreach (EnvDTE.Project p in VS2015Instance.Solution.Projects) { if(p.UniqueName.Contains(projectName)) { // At this point I have a reference to my VC project. // Here I'd like to set some linker option before building the // project. VS2015Instance.ExecuteCommand("Build.BuildSolution"); } } 跟踪时完全没问题。

答案 1 :(得分:1)

C#的Nullable type旨在允许值类型具有null值,而Scala的Option旨在完全摆脱null。相反,您可以在Option[A]上模式匹配,以获得SomeNone。您可以将Option视为Nullable type的广义版本。

然而,处理的问题并不完全相同:C#试图向值类型添加类似对象的行为,而Scala正试图提供null的安全替代方案。但是,Scala的Option也解决了Nullable type设计用于的值类型问题:

scala> case class MyInt(val i: Int) extends AnyVal // scala value type

scala> null : MyInt
<console>:14: error: type mismatch;
  found   : Null(null)
  required: MyInt
        null : MyInt
        ^

scala> None : Option[MyInt]
res1: Option[MyInt] = None

scala> Some(MyInt(1)) : Option[MyInt]
res2: Option[MyInt] = Some(MyInt(1)) 

我还应该提到Nullable type内置于C#语言中,而Option只是标准库中的常规Scala类。