标签: conditional-operator

在三元运算符中获取不需要的NullPointerException - 为什么?

在执行以下代码时,我得到一个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)

有人能帮我理解这种行为吗?

java double nullpointerexception conditional-operator

48
推荐指数
2
解决办法
2623
查看次数

如何使用条件三元运算符在lambdas之间有条件地分配Func <>?

通常,在使用条件运算符时,这是语法:

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)

c# lambda conditional-operator

47
推荐指数
2
解决办法
4662
查看次数

逻辑和条件AND之间的区别是什么,在C#中是OR?

可能重复:
|之间的差异是什么 和|| 还是运营商?

逻辑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# conditional-operator logical-operators

47
推荐指数
3
解决办法
8万
查看次数

C和C++之间的条件运算符差异

我在某处读到?:C 中的运算符在C++中略有不同,有些源代码在两种语言中都有不同的作用.不幸的是,我找不到任何地方的文字.有谁知道这有什么区别?

c c++ conditional-operator

46
推荐指数
2
解决办法
6292
查看次数

44
推荐指数
5
解决办法
1万
查看次数

C#?:条件运算符

我有这个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而第二个结果评估不抛出.这两者有什么区别?

.net c# conditional-operator c#-2.0

41
推荐指数
3
解决办法
2万
查看次数

方法使用三元运算符调用

在玩弄新概念时,我偶然发现了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方法调用的想法.

我做了一些研究,我找不到任何人这样做的例子,所以我想我可能希望有一些无法提供的东西. …

c# conditional-operator

41
推荐指数
5
解决办法
3万
查看次数

JSTL/EL中的三元运算符

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.E​​LException:错误解析:$ {空值?'无':值}

那么为什么会这样呢?


我正在使用该JSTL 1.1库,包含以下taglib,

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Run Code Online (Sandbox Code Playgroud)

jsp jstl el ternary-operator conditional-operator

41
推荐指数
1
解决办法
7万
查看次数

Perl三元条件运算符问题中的赋值

我程序中的Perl代码片段给出了错误的结果.

$condition ? $a = 2 : $a = 3 ;
print $a;
Run Code Online (Sandbox Code Playgroud)

无论价值$condition是什么,输出总是3,怎么样?

perl conditional-operator operator-precedence

40
推荐指数
3
解决办法
5780
查看次数

为什么这个代码在C#中无效?

以下代码将无法编译:

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"标签,因为这个问题没有涉及拳击.

c# dbnull nullable conditional-operator

40
推荐指数
3
解决办法
1万
查看次数