在Scala中,您有Option[Int]
Some(number)
或None
,其属性isDefined
在第一种情况下返回true
并{{1}在另一个。
在C#中,您有false
int?
或a number
,其属性null
在第一种情况下返回HasValue
并{{1}在另一个。
Scala的true
是否与C#的false
相同,是否存在差异?
答案 0 :(得分:5)
不,它根本不是一样的。除了其他答案:
Scala有Option[Option[Int]]
; C#没有int??
。
Scala有Option[String]
; C#没有string?
。
在C#中,存在从T
到T?
的隐式转换;在Scala中,没有从T
到Option[T]
的隐式转换(Scala允许您手动定义此类转换,但不建议这样做。)
这意味着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]
上模式匹配,以获得Some
或None
。您可以将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类。