在执行以下代码时,我得到一个NullPointerException在线:
value = condition ? getDouble() : 1.0;
Run Code Online (Sandbox Code Playgroud)
在早期的行中,当我使用null而不是getDouble()一切都有效时,这很奇怪.
public class Test {
static Double getDouble() {
return null;
}
public static void main(String[] args) {
boolean condition = true;
Double value;
value = condition ? null : 1.0; //works fine
System.out.println(value); //prints null
value = condition ? getDouble() : 1.0; //throws NPE
System.out.println(value);
}
}
Run Code Online (Sandbox Code Playgroud)
有人能帮我理解这种行为吗?
通常,在使用条件运算符时,这是语法:
int x = 6;
int y = x == 6 ? 5 : 9;
Run Code Online (Sandbox Code Playgroud)
没有什么花哨的,非常直接的.
现在,让我们在将Lambda分配给Func类型时尝试使用它.让我解释:
Func<Order, bool> predicate = id == null
? p => p.EmployeeID == null
: p => p.EmployeeID == id;
Run Code Online (Sandbox Code Playgroud)
这是相同的语法,应该工作吗?对?出于某种原因,没有.编译器提供了这个不错的神秘消息:
错误1无法确定条件表达式的类型,因为"lambda表达式"和"lambda表达式"之间没有隐式转换
然后我继续改变语法,这样它确实有效:
Func<Order, bool> predicate = id == null
? predicate = p => p.EmployeeID == null
: predicate = p => p.EmployeeID == id;
Run Code Online (Sandbox Code Playgroud)
我只是好奇为什么它不能以第一种方式工作?
(旁注:我最终不需要这段代码,因为我发现在将int值与null进行比较时,只需使用object.Equals)
可能重复:
|之间的差异是什么 和|| 还是运营商?
逻辑AND和OR:
(x & y)
(x | y)
Run Code Online (Sandbox Code Playgroud)
条件AND和OR:
(x && y)
(x || y)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我只知道条件操作数.我知道它的作用以及如何在if语句中应用它.但逻辑操作数的目的是什么?
我在某处读到?:C 中的运算符在C++中略有不同,有些源代码在两种语言中都有不同的作用.不幸的是,我找不到任何地方的文字.有谁知道这有什么区别?
PHP中有哪些?和:运算符?
例如:
(($request_type == 'SSL') ? HTTPS_SERVER : HTTP_SERVER)
Run Code Online (Sandbox Code Playgroud) 我有这个C#2.0源代码的摘录:
object valueFromDatabase;
decimal result;
valueFromDatabase = DBNull.Value;
result = (decimal)(valueFromDatabase != DBNull.Value ? valueFromDatabase : 0);
result = (valueFromDatabase != DBNull.Value ? (decimal)valueFromDatabase : (decimal)0);
Run Code Online (Sandbox Code Playgroud)
第一个结果评估抛出,InvalidCastException而第二个结果评估不抛出.这两者有什么区别?
在玩弄新概念时,我偶然发现了Ternary Operator它的美丽.在玩了一段时间之后,我决定测试它的极限.
然而,当我无法编译某段代码时,我的乐趣很快就结束了.
int a = 5;
int b = 10;
a == b ? doThis() : doThat()
private void doThis()
{
MessageBox.Show("Did this");
}
private void doThat()
{
MessageBox.Show("Did that");
}
Run Code Online (Sandbox Code Playgroud)
这行给了我两个错误:
Error 1 Only assignment, call, increment, decrement, and new object expressions can be used as a statement
Error 2 Type of conditional expression cannot be determined because there is no implicit conversion between 'void' and 'void'
Run Code Online (Sandbox Code Playgroud)
我从来没有使用Ternary Operator过来决定调用哪种方法,也不知道它是否可行.我只是喜欢一行If Else Statement方法调用的想法.
我做了一些研究,我找不到任何人这样做的例子,所以我想我可能希望有一些无法提供的东西. …
JSTL的以下标记可用于将值设置为请求范围中的变量.
<c:set var="value" scope="request" value="someValue"/>
Run Code Online (Sandbox Code Playgroud)
我想要有条件地检查,如果value设置的变量是否为空,并显示相应的结果,如下所示,使用<c:when>...</c:when>.
<c:choose>
<c:when test="${not empty value}">
<c:out default="None" value="${value}"/>
</c:when>
<c:otherwise>
<c:out default="None" value="None"/>
</c:otherwise>
</c:choose>
Run Code Online (Sandbox Code Playgroud)
我想使用三元表达式来减少代码行,比如
<c:out default="None" value="${not empty value ? value : 'None'}"/>
Run Code Online (Sandbox Code Playgroud)
它被评估,因为它实际上意味着,但如果我交换表达式的顺序,如,
<c:out default="None" value="${empty value ? 'None' : value}"/>
Run Code Online (Sandbox Code Playgroud)
然后是语法错误指示,
"$ {空值?'无':值}"包含无效表达式:javax.el.ELException:错误解析:$ {空值?'无':值}
那么为什么会这样呢?
我正在使用该JSTL 1.1库,包含以下taglib,
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Run Code Online (Sandbox Code Playgroud) 我程序中的Perl代码片段给出了错误的结果.
$condition ? $a = 2 : $a = 3 ;
print $a;
Run Code Online (Sandbox Code Playgroud)
无论价值$condition是什么,输出总是3,怎么样?
以下代码将无法编译:
string foo = "bar";
Object o = foo == null ? DBNull.Value : foo;
Run Code Online (Sandbox Code Playgroud)
我得到:错误1无法确定条件表达式的类型,因为'System.DBNull'和'string'之间没有隐式转换
要解决这个问题,我必须做这样的事情:
string foo = "bar";
Object o = foo == null ? DBNull.Value : (Object)foo;
Run Code Online (Sandbox Code Playgroud)
这个演员似乎毫无意义,因为这肯定是合法的:
string foo = "bar";
Object o = foo == null ? "gork" : foo;
Run Code Online (Sandbox Code Playgroud)
在我看来,当三元分支具有不同类型时,编译器不会将值自动提供给类型对象...但是当它们属于相同类型时,则自动装箱是自动的.
在我看来,第一个声明应该是合法的......
任何人都可以描述为什么编译器不允许这样做以及为什么C#的设计者选择这样做?我相信这在Java中是合法的......虽然我没有验证这一点.
谢谢.
编辑:我要求理解为什么Java和C#以不同的方式处理这个问题,C#中的场景下发生了什么使得它无效.我知道如何使用三元,而不是寻找一个"更好的方法"来编写示例代码.我理解C#中的三元规则,但我想知道为什么......
编辑(Jon Skeet):删除了"autoboxing"标签,因为这个问题没有涉及拳击.