我遇到了需要在var
块中定义if-else
的情况。但是,你做不到,
var myVar;
if(myBool) { myVar = 0; }
else { myVar = 1; }
因为您收到错误,“必须初始化隐式类型变量”。现在,我可以声明变量以if
块中的内容开始,然后在if
块内部不做任何事情,但这似乎是不好的做法。建议?
另外,请注意,这是一个简化的方案,我不能做一些简单的事情,如下所示,
var myVar = 0;
if(!myBool) { myVar = 1; }
编辑:尝试使用枚举。 if-else
块会将myVar
设置为枚举。
答案 0 :(得分:3)
你应该使用:?
,它更实用:
var myVar = myBool ? 0 : 1;
如果你的逻辑更复杂,并且你想避免许多嵌套的?:
,我建议你做一个小的静态函数:
private static int computeWhatever(bool myBool)
{
// etc...
}
var myVar = computeWhatever(myBool);
可悲的是,这是可以在其他语言中更紧凑地编写的内容,特别是那些使用" do expressions"。表达式允许将语句块作为表达式进行求值,并使用最少的样板。
例如,在JavaScript提案中:
x = do { let t = f(); t * t + 1 };
print(do { let x = f(); g(x, x) });
如果你想留在.NET世界并使用这个结构,F#将是最好的选择。
在回应一些评论时,我认为在块之前将变量声明为未初始化是不好的风格:
int myVar;
if (!myBool)
{
myVar = 1;
}
如果您的变量始终被初始化,并且理想情况下从未更改过,那么它们就更容易推理。作为额外的奖励,代码在没有副作用时更容易重构。如果您总是喜欢?:
,那么您就走在了正确的轨道上。只是不要过于教条!
答案 1 :(得分:2)
如果你没有初始化变量,编译器就不能告诉它应该有什么类型。
如果您使用实际类型而不是var
声明它,那么您就可以了。
答案 2 :(得分:0)
因为您无法执行此操作,请使用显式键入并继续:
int myVar;
if(myBool) { myVar = 0; }
else { myVar = 1; }
最酷的代码是可行的(隐式打字不是作为世界上任何案例的银弹引入的。)