C# ?? 带两个字符串的运算符?
在此.NET代码中:C# ?? 带两个字符串的运算符?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,在此.NET代码中: return Redirect("~/Home" ?? "JaneDoe"); 如果我读对了文档,则“”运算符的操作与SQL中的IsNull类似: IsNull("~/Home", "JaneDoe") “~Home”和“JaneDoe”只是字符串,对吗?return Redirect代码中没有条件,其中“JaneDoe”将被传递到“Redirect”中,是吗?我不知道该如何理解这个片段,我只能假设它是一个占位符,用于以后的内容 这段代码来自一个正在开发的.NET-MV
return Redirect("~/Home" ?? "JaneDoe");
如果我读对了文档,则“”运算符的操作与SQL中的IsNull类似:
IsNull("~/Home", "JaneDoe")
“~Home”
和“JaneDoe”
只是字符串,对吗?return Redirect
代码中没有条件,其中“JaneDoe”将被传递到“Redirect”中,是吗?我不知道该如何理解这个片段,我只能假设它是一个占位符,用于以后的内容
这段代码来自一个正在开发的.NET-MVC项目,它是LoginController的
.cs
文件的一部分。是的,这只是一段糟糕的代码。这将永远等同于
return Redirect("~/Home");
老实说,我有点惊讶编译器不够聪明,不能给出警告。如果它能告诉我们在null合并运算符的LHS上使用了一个常量非null表达式,那就太好了。是的,您读的是正确的。它将始终返回“~/Home”,可能是计划在某个时候将其更改为变量。正确,表达式将永远不会返回“JaneDoe”。这将始终使用
“~/Home”
字符串。空合并运算符(?)选择左侧(如果为非空),或右侧(如果为空)。该运算符称为空合并运算符,用于为可空值类型和引用类型定义默认值。如果左操作数不为空,则返回左操作数;否则返回正确的操作数
在您的情况下,它将永远不会返回JaneDoe您应该将其提交给Dailywtf.com。我认为您的意思是IfNull,而不是IsNull。我认为这是null--@siride No,正确的SQL命令是IsNull(whatToCheck,replacementIfNull)。NULLIF(x,y)(不是ifNull)实际上是一个非常不同的SQL命令,因为它返回(x==y)?null:x;IfNull,而不是NullIf。看起来SQL小姐没有。MySQL和其他一些数据库都有它。谢谢,是的,它似乎是一个占位符。@artlung:看来编写代码的人也在学习;)@Jon Skeet:-|是的,在这一点上,我看不出.NET-MVC示例项目(例如:)与此之间有多大区别。我知道ReSharper插件会捕捉到这一点,但不知道vanilla与check-as-you-go的区别。为了让编译器捕捉到它,编译器团队中的某个人必须首先考虑场景。我从来没想到会有人将文本字符串传递给??也就是说,编译器会跟踪哪些表达式不可能为null,以便实现较小的代码生成优化。(对不可能为null的表达式调用非虚拟实例方法可以跳过接收方的null检查)。我们可以使用此信息检查null合并运算符的左侧是否可能为null。