C# C中的Maybe/Option单子#

C# C中的Maybe/Option单子#,c#,monads,option,maybe,C#,Monads,Option,Maybe,现在是2015年,C#中是否有任何“官方”的monad?理想情况下,它会像Scala的选项一样工作,有一些类型,没有类型 C#似乎拥有所需的一切,即co/CONTRAVANCE和lambdas 我问这个问题是因为我最近开始在一家使用Unity的公司工作,我遇到了很多延迟初始化的问题。为了避免NullPointerException,我想邀请他们加入monad世界。对此有什么想法,或者我们应该用另一种方式来处理 至于“官方”方法,请记住,如果您使用的是C#6,您可以使用: 某些VisualStud

现在是2015年,C#中是否有任何“官方”的monad?理想情况下,它会像Scala的选项一样工作,有一些类型,没有类型

C#似乎拥有所需的一切,即co/CONTRAVANCE和lambdas

我问这个问题是因为我最近开始在一家使用Unity的公司工作,我遇到了很多延迟初始化的问题。为了避免NullPointerException,我想邀请他们加入monad世界。对此有什么想法,或者我们应该用另一种方式来处理

至于“官方”方法,请记住,如果您使用的是C#6,您可以使用:

某些VisualStudio模板(如ASP.NET MVC项目模板)还包括,它是AjaxMinExtensions的一部分。如果您的项目中没有这些,您可以将实现复制/粘贴到代码中

var myVal = possiblyNull.IfNotNull(v => v.doTheThing())
                        .IfNotNull(theThing => theThing.TheProperty);

不,没有“开箱即用”的官方monad,但您可以在NugetCheck上找到许多实现。请查看:。我想我很怀疑这是否会增加可读性。我会选择Java的可选构造。接受的答案还链接到忽略(由我承担风险)您对monad的特定请求,因为“大量延迟初始化”,您是否有可能只需要使用
Lazy
类?您的问题缺少很多上下文,这些上下文可以帮助人们理解您实际要解决的具体问题。请看,还有。当然有这样一种类型-它隐藏在
FSharp.Core
;)虽然Being称之为“一元”运算符,但这并不完全相同-如果您使用
可能
选项
键入,编译器将帮助您查看您没有处理可能的空值的地方(通过给您错误)@CarstenKönig是的,当然是真的。
var myVal = possiblyNull.IfNotNull(v => v.doTheThing())
                        .IfNotNull(theThing => theThing.TheProperty);