我的一位同事遇到了一个有趣的问题。我通过下面的简单示例代码重新创建了该问题。问题在于,编译器抱怨i
在第三行中使用时可能未分配。
我知道如果GetProperty
为o
,null
不会被执行,然后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 è stato inviato
correttamente!</div>';
echo '</div>';*/
}
答案 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 //
}