为了账号安全,请及时绑定邮箱和手机立即绑定

有什么办法欺骗编译器允许这样做吗?

有什么办法欺骗编译器允许这样做吗?

C#
慕斯709654 2021-04-02 14:13:15
我有一个XAML工作流程,相当于Bar bar;if (foo.SomeFlag){    // ... do stuff    bar = .. // set bar, guaranteed unless exception thrown earlier in this block}// do other stuff // here it is guaranteed that foo.SomeFlag is the same as it was beforeif (foo.SomeFlag){   // use bar}在普通的C#中,我如何尝试重写它。问题是我遇到Use of unassigned variable 'bar' ..编译器错误。我了解错误,但是我认为我可以通过编写文字来克服错误Bar bar;const bool someFlag = foo.SomeFlag;if (someFlag){    // ... do stuff    bar = .. // set bar, guaranteed unless exception thrown earlier in this block}// do other stuff if (someFlag){   // use bar}但显然这不是有效的语法。任何想法如何克服?
查看完整描述

3 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

编译器要求bar在使用它之前将其设置为某个值,并且由于someFlag可能在您的if块之间进行更改(这意味着第一个块可能无法运行,而第二个块可能会运行),因此它将给您带来错误。为避免这种情况,您可以最初将bar设置为默认值:


Bar bar = default(Bar);   // this will be 'null' for class objects

然后您的其余代码应按预期工作


const bool someFlag = foo.SomeFlag;


if (someFlag)

{

    // Do something, assign bar to new value

    bar = new Bar();

}


// Do some other stuff 


// Possibly add a check that bar was set, just to be safe...

if (someFlag && bar != null)

{

    // Use bar

    bar.DoSomething();

}


查看完整回答
反对 回复 2021-04-17
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

欺骗编译器允许这样做意味着您的解决方案将有机会出现异常。


想想,如果foo.SomeFlag不正确怎么办?bar的值将为null,或更具体地说,它将为default(Bar)。(是的,编译器知道任何类型的默认值是什么)。如果按照我的想法,Bar是一个类,则该值肯定为null。然后当它尝试使用bar时,假设您尝试使用bar,它会引发异常。编译器实际上是在保护您免受它侵害。


解决的方法只是在使用bar之前进行空检查。喜欢:


if (someFlag)

{

   if(bar != null)

   {

       // use bar

   }

}

尽管如此,我强烈建议您开始初始化变量,这样您就可以肯定并且不会忘记。喜欢:


解决方案1:用一些东西开始吧。


Bar bar = null; // <- Only if you know for sure Bar is a class

// or

Bar bar = default(Bar);


if (foo.SomeFlag)

{

    ...

}

解决方案2:另辟else径


if (foo.SomeFlag)

{

   ...

}

else

{

    bar = null; // <- Only if you know for sure Bar is a class

    // or

    bar = default(bar);

}

...


查看完整回答
反对 回复 2021-04-17
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

编译器不够智能,无法识别您的if块是否将被实际执行。因此,它假定bar在使用之前可能无法初始化。为了减轻这种情况,只需将bar初始值设置为null或提供一条else语句即可。


Bar bar = null;


const bool someFlag = foo.SomeFlag;


if (someFlag)

{

    // ... do stuff


    bar = .. // set bar, guaranteed unless exception thrown earlier in this block

}


// do other stuff 


if (someFlag)

{

   // use bar

}

或者:


Bar bar;


const bool someFlag = foo.SomeFlag;


if (someFlag)

{

    // ... do stuff


    bar = .. // set bar, guaranteed unless exception thrown earlier in this block

}

else

{

    bar = null;

}


// do other stuff 


if (someFlag)

{

   // use bar

}


查看完整回答
反对 回复 2021-04-17
  • 3 回答
  • 0 关注
  • 119 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信