通用方法中的“使用未分配的局部变量”

时间:2011-02-06 00:25:19

标签: c# generics

使用未分配的局部变量'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;
}

4 个答案:

答案 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)

使用局部变量时,必须始终在访问它们之前为它们分配值。

这是因为通常,当开发人员省略初始化时,他依赖于运行时为其分配默认值,但在他忘记的情况下,这可能会导致一些不必要的错误。

如果使用泛型,而不是指定您是否期望ReferenceTypeValueType,则不能通过指定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
    }
}