默认为“var”供以后使用

时间:2016-12-06 20:26:19

标签: c#

我遇到了需要在var块中定义if-else的情况。但是,你做不到,

var myVar;

if(myBool) { myVar = 0; }
else { myVar = 1; }

因为您收到错误,“必须初始化隐式类型变量”。现在,我可以声明变量以if块中的内容开始,然后在if块内部不做任何事情,但这似乎是不好的做法。建议?

另外,请注意,这是一个简化的方案,我不能做一些简单的事情,如下所示,

var myVar = 0;
if(!myBool) { myVar = 1; }

编辑:尝试使用枚举。 if-else块会将myVar设置为枚举。

3 个答案:

答案 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; }

最酷的代码是可行的(隐式打字不是作为世界上任何案例的银弹引入的。)