繁体   English   中英

在这种情况下,为什么“if-else”与三元运算符“?:”的工作方式不同?

[英]Why does “if-else” work differently from the ternary operator “?:” in this case?

声明类

class A
{
    public string a;
    public static implicit operator A(B b) => new A() { a = b.b };
}
class B
{
    public string b;
}

比较?:if-else

static public A Method1(B b)
{ 
    return (b is null) ? null : b; //equally return b;
}
static public A Method2(B b)
{
    if (b is null) return null; else return b;
}

Method1 会抛出异常
方法2可以正常工作

Method1(null);
Method2(null);

为什么他们的行为不同?

Method1中使用三元运算符时,两个分支中的返回值类型必须相同(在您的情况下为B )。 该值必须稍后转换为A以匹配方法的返回类型。 因此,在隐式运算符中会引发NullReferenceException (因为b为空)。

另一方面,在Method2中,您直接返回null 所以,不需要演员表。

如果将 Method2 更改为以下内容,您将在Method2中得到相同的结果(即异常):

static public A Method2(B b)
{
    B temp;
    if (b is null) temp = null; else temp = b;
    return temp; // Throws a NullReferenceException.
}

你应该做的是在隐式运算符中添加一个空检查:

public static implicit operator A(B b) => (b is null ? null : new A { a = b.b });

Method1

对于三元运算符类型的返回值应该相等。 所以null实际上返回为(B)null ,然后使用隐式运算符转换为A类型

Method2

返回值直接转换为(A)null ,不使用隐式运算符。

Bonus

尝试将Method1的返回类型更改为B ,它应该可以工作。

    public static B Method1(B b)
    {
        return (b is null) ? null : b;                  
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM