if子句中的可选空合并

时间:2019-02-13 09:20:12

标签: c#

我的一位同事遇到了一个有趣的问题。我通过下面的简单示例代码重新创建了该问题。问题在于,编译器抱怨i在第三行中使用时可能未分配。

我知道如果GetPropertyonull不会被执行,然后i不会被初始化,但是在那种情况下,我也不会求值int i2 = i;。是否有一些关于可选参数或空合并运算符的信息,我不知道这与这里是否相关,或者这仅仅是编译器不够智能,无法知道如果未初始化i则不使用void Test(object o) { if (o?.GetProperty("Blah", out int i) ?? false) { int i2 = i; } } 的情况?

require 'PHPMailer_5.2.0/PHPMailerAutoload.php';
$mail = new PHPMailer;

$mail->isSMTP();                                     
$mail->Host = 'smtp.smtp.com';  
$mail->SMTPAuth = true;                               
$mail->Username = 'admin@admin.it';                
$mail->Password = 'XXXXXX';                         
$mail->SMTPSecure = 'tls';                           
$mail->Port = 587;                                   

$mail->setFrom('admin@admin.it', 'Name Surname'); 
$mail->addAddress($_POST['email']);    
$mail->AddBCC("info@admin.com"); 

$mail->isHTML(true);  

$mail->Subject = 'Report Questionario PugliaParadise';
$mail->Body    = 'This is the body message';

$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo '<div id="successo-email">Grazie! Il tuo report &egrave; stato inviato 
correttamente!</div>';
echo '</div>';*/
 }

1 个答案:

答案 0 :(得分:6)

您正在将{strong>空条件访问与o?一起使用,这意味着(当o为null时)有可能不会被调用GetProperty

这引入了未初始化的i的可能性。因为在out int i为空的情况下不会调用o

可以通过删除空条件访问来测试代码

void Test(SomeClass o) {
    if (o.GetProperty("Blah", out int i) ?? false) {
        int i2 = i; //no-compiler error 
    }
}

在上述方法中,始终会调用GetProperty方法,因此i总是被初始化和分配。


另一方面,您的代码无法编译,object o本身没有.GetProperty方法


if (o?.GetProperty("Blah", out int i) ?? false)

可以扩展为

if (o != null)
{
     if (o.GetProperty("Blah", out int i))
     {
     }
}
else
{
     //i is not defined in this context //
}