使用未分配的局部变量'model'。我收到了什么错误信息。它就在我说if(model == null)的地方。我不知道为什么它给我一个编译时错误..有人请帮忙。
public static T TryGet<T>(string fileName) where T : new()
{
T model;
using (var storageFile = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var stream = new IsolatedStorageFileStream(fileName, FileMode.Open, storageFile))
{
if (stream.Length > 0)
{
var serializer = new DataContractSerializer(typeof(T));
model = (T)serializer.ReadObject(stream);
}
}
}
if (model == null)
{
model = new T();
}
return model;
}
答案 0 :(得分:15)
如错误所述,在编译器可以证明它已被赋值之前,您不能使用局部变量。
在您的情况下,如果您的if
条件为false,则永远不会分配model
变量。
您可以通过首先为其分配初始值来解决问题:
T model = default(T);
请注意,如果T
是结构类型,则model == null
永远不会为真。
您应该将代码更改为
using (var storageFile = IsolatedStorageFile.GetUserStoreForApplication())
using (var stream = new IsolatedStorageFileStream(fileName, FileMode.Open, storageFile))
{
if (stream.Length > 0)
{
var serializer = new DataContractSerializer(typeof(T));
return (T)serializer.ReadObject(stream);
}
else
{
return new T();
}
}
答案 1 :(得分:3)
在你说出来之前,编译器不知道要分配什么。
而不是T model;
使用T model = default(T);
有关详细信息:http://msdn.microsoft.com/en-us/library/xwth0h0d(v=vs.80).aspx
编辑:另一种选择是将新语句移动到反序列化块之前。这样,您就可以像现在一样拥有一个新对象或反序列化对象。
答案 2 :(得分:3)
使用局部变量时,必须始终在访问它们之前为它们分配值。
这是因为通常,当开发人员省略初始化时,他依赖于运行时为其分配默认值,但在他忘记的情况下,这可能会导致一些不必要的错误。
如果使用泛型,而不是指定您是否期望ReferenceType
或ValueType
,则不能通过指定null
来简单地初始化它。
在这种情况下,您需要使用default
keyword。
这会将变量初始化为引用类型的null
,或者为数值类型指定0
。对于结构体,它会将每个成员初始化为默认值。
在您发布的示例中,与null
的比较让我假设此方法可能仅用于ReferenceTypes,如果是这种情况,最好还添加class
约束。
答案 3 :(得分:1)
因为model
是一个局部变量,所以编译器会给你这个错误,因为它只在if语句中赋值。如果if语句条件不为真,则不会为model
分配值。尝试为其设置默认值null
或添加else语句并在其中分配model
。
T model = null;
局部变量不会自动初始化,但实例变量是。
public class MyClass<T>
{
private T instanceVariable; // automatically initialized
public void MyMethod()
{
T localVariable; // not automatically initialized
}
}