[英]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.