在斯卡拉你有Option[Int]
這將是Some(number)
或None
和有一個屬性isDefined
其中返回true
在第一種情況和false
在其他。Scala選項與C#可空類型相同嗎?
在C#中你有int?
這將是a number
或null
並有一個屬性HasValue
返回在第一種情況下true
和其他false
。
斯卡拉的Option
與C#的Nullable type
相同,有什麼區別嗎?
在斯卡拉你有Option[Int]
這將是Some(number)
或None
和有一個屬性isDefined
其中返回true
在第一種情況和false
在其他。Scala選項與C#可空類型相同嗎?
在C#中你有int?
這將是a number
或null
並有一個屬性HasValue
返回在第一種情況下true
和其他false
。
斯卡拉的Option
與C#的Nullable type
相同,有什麼區別嗎?
不,它不完全相同。除了其他答案:
Scala有Option[Option[Int]]
; C#沒有int??
。
斯卡拉有Option[String]
; C#沒有string?
。
在C#中,存在從T
到T?
的隱式轉換;在Scala中,沒有從T
到Option[T]
的隱式轉換(Scala允許您手動定義這種轉換,但不建議這樣做)。
這意味着Option
是一個很大的均勻和可組合比?
並允許它被更廣泛地使用。例如。斯卡拉的Map[K, V].get(K)
返回Option[V]
;但在.Net中,Dictionary<TKey, TValue>[TKey]
不能返回TValue?
,因爲TValue
可以是引用類型。即使相當於Option.map
,也需要爲返回值類型和引用類型的函數分別實現。我也想重申一下get
應該避免! isDefined
雖然沒有後面get
是完全正常的。
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類。
@Servy謝謝,修正。 –
'即使是相當於期權。map需要爲返回值類型和引用類型的函數分別實現不同的實現。「實際上,在C#中,該方法使用'。?'運算符烘焙成語言。它支持所有可空類型,包括'Nullable'。 – Servy
不,''?'不等於'map',因爲你不能傳遞一個任意的委託給它。如果是的話,它必須建立在語言之上,你不能自己寫(根據我的理解)。 –