2016-07-07 29 views
5

在斯卡拉你有Option[Int]這將是Some(number)None和有一個屬性isDefined其中返回true在第一種情況和false在其他。Scala選項與C#可空類型相同嗎?

在C#中你有int?這將是a numbernull並有一個屬性HasValue返回在第一種情況下true和其他false

斯卡拉的Option與C#的Nullable type相同,有什麼區別嗎?

回答

5

不,它不完全相同。除了其他答案:

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

  2. 斯卡拉有Option[String]; C#沒有string?

  3. 在C#中,存在從TT?的隱式轉換;在Scala中,沒有從TOption[T]的隱式轉換(Scala允許您手動定義這種轉換,但不建議這樣做)。

這意味着Option是一個很大的均勻可組合?並允許它被更廣泛地使用。例如。斯卡拉的Map[K, V].get(K)返回Option[V];但在.Net中,Dictionary<TKey, TValue>[TKey]不能返回TValue?,因爲TValue可以是引用類型。即使相當於Option.map,也需要爲返回值類型和引用類型的函數分別實現。我也想重申一下get應該避免! isDefined雖然沒有後面get是完全正常的。

+0

@Servy謝謝,修正。 –

+0

'即使是相當於期權。map需要爲返回值類型和引用類型的函數分別實現不同的實現。「實際上,在C#中,該方法使用'。?'運算符烘焙成語言。它支持所有可空類型,包括'Nullable'。 – Servy

+0

不,''?'不等於'map',因爲你不能傳遞一個任意的委託給它。如果是的話,它必須建立在語言之上,你不能自己寫(根據我的理解)。 –

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類。

相關問題