避免使用“未分配的局部变量”错误

时间:2013-10-11 19:10:27

标签: c# closures action

我有两种与此相当的方法(原谅人为的例子):

public void WithResource(Action<Resource> action) {
    using (var resource = GetResource()) {
        action(resource);
    }
}

public void Test() {
    int id;
    SomeObject someObject;

    WithResource((resource) => {
        id = 1;
        someObject = SomeClass.SomeStaticMethod(resource);
    });

    Assert.IsNotNull(someObject);
    Assert.AreEqual(id, someObject.Id);
}

(WithResource调用中还有一些逻辑,我试图将其分解出去。)

因为断言,我得到Use of unassigned local variable编译时错误 是...使用未分配的变量。我目前通过分别为它们分配-1和null来避免这个问题。

初始化为null并不会感觉不好,但我想避免将-1放在那里......我真的想告诉编译器“相信我,这将被初始化”。因为它是一个测试,如果它是炸弹,我实际上并不太在意,因为这只意味着我必须修复测试。

我很想问是否有办法给编译器提供这个提示,但感觉更加丑陋。是否存在这样的提示或者我应该像现在一样初始化变量?

3 个答案:

答案 0 :(得分:6)

编译器不够智能来确定是否会进行分配,从而确定错误。

您无法对此做任何事情,您必须为其指定一些默认值,可能是0-1default(int)int.MinValue

答案 1 :(得分:3)

您应该初始化变量。编译器永远不会信任你;)

答案 2 :(得分:3)

其他答案都是正确的。解决此问题的最简单方法是初始化本地人。

我假设您理解为什么会产生错误:编译器无法知道名为的方法实际上运行lambda ,因此不知道本地语言已初始化。

欺骗编译器不检查是否分配变量的唯一方法是使变量非本地:

public void Test() {
    int[] id = new int[1];
    SomeObject[] someObject = new SomeObject[1];

    WithResource((resource) => {
        id[0] = 1;
        someObject[0] = SomeClass.SomeStaticMethod(resource);
    });

    Assert.IsNotNull(someObject[0]);
    Assert.AreEqual(id[0], someObject.Id);
}

现在你可能会说,我已经清楚地分配了id。是的,但请注意编译器抱怨您在初始化之前使用了id[0]!编译器知道数组元素变量初始化为零。