5

我有两种等效的方法(请原谅人为的示例):

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编译时错误,因为断言是......使用未分配的变量。我目前通过null分别分配-1 和 来避免这个问题。

初始化到null感觉不错,但我想避免将 -1 放在那里......我真的很想告诉编译器“相信我,这将被初始化”。既然是测试,我其实不太在意它是否会爆炸,因为那只意味着我必须修复测试。

我很想问是否有办法向编译器提供该提示,但感觉更难看。是否存在这样的提示,或者我应该像现在这样初始化变量吗?

4

3 回答 3

7

编译器不够聪明,无法确定是否会进行分配,从而导致错误。

您对此无能为力,您必须为其分配一些默认值,可能是0, -1,default(int)int.MinValue

于 2013-10-11T19:13:37.317 回答
3

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

于 2013-10-11T19:13:06.677 回答
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]编译器知道数组元素变量被初始化为零。

于 2013-10-12T14:34:44.460 回答