我有两种与此相当的方法(原谅人为的例子):
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放在那里......我真的想告诉编译器“相信我,这将被初始化”。因为它是一个测试,如果它是炸弹,我实际上并不太在意,因为这只意味着我必须修复测试。
我很想问是否有办法给编译器提供这个提示,但感觉更加丑陋。是否存在这样的提示或者我应该像现在一样初始化变量?
答案 0 :(得分:6)
编译器不够智能来确定是否会进行分配,从而确定错误。
您无法对此做任何事情,您必须为其指定一些默认值,可能是0
,-1
,default(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]
!编译器知道数组元素变量初始化为零。