C# 为什么这个monad不能编译

C# 为什么这个monad不能编译,c#,visual-studio-2015,.net-4.6,C#,Visual Studio 2015,.net 4.6,为什么这个单子不编译?注释行工作正常。添加其中U:class使其可编译,但这增加了限制 public static U To<T, U>(this T self, Func<T, U> eval) => eval?.Invoke(self) ?? default(U); // => eval == null ? default(U) : eval(self); publicstaticu-To(这个T-self,Func-eval) =>评估

为什么这个单子不编译?注释行工作正常。添加
其中U:class
使其可编译,但这增加了限制

public static U To<T, U>(this T self, Func<T, U> eval)
    => eval?.Invoke(self) ?? default(U);
    // => eval == null ? default(U) : eval(self);
publicstaticu-To(这个T-self,Func-eval)
=>评估?调用(自身)??违约(U);
//=>eval==null?默认值(U):评估(自身);
运算符“?”不能应用于“U”类型的操作数

@复制品


无论如何,不要认为这是那个的复制品。我正在合并func,而不是泛型类型,并在coalesc(?)not null条件运算符(?)上获得错误,就像在另一个问题中一样。

因为类是可空的('eval')可以工作。我的意思是说“containts”似乎没有提供一种方法来指定“struct”现在可以为null。type
U
可以是值类型,并且不能与null合并运算符(
)或null条件运算符(
)一起使用。(请注意,由于某些原因,此问题已被回答并删除)。要修复它,您可以在方法上添加
where U:class
约束。@DavidG-Well正在合并func
eval
=>eval?.Invoke(self)??评价(自我)(白痴语句但删除U)给出了相同的错误。。?正如我所说,添加约束限制了monad。因为类是可空的(“eval?”可以工作)。我的意思是说“containts”似乎没有提供一种方法来指定“struct”现在可以为null。type
U
可以是值类型,并且不能与null合并运算符(
)或null条件运算符(
)一起使用。(请注意,由于某些原因,此问题已被回答并删除)。要修复它,您可以在方法上添加
where U:class
约束。@DavidG-Well正在合并func
eval
=>eval?.Invoke(self)??评价(自我)(白痴语句但删除U)给出了相同的错误。。?正如我所悲伤的,添加约束限制了monad。