C# 如何修复';错误CS0165:使用未分配的局部变量';在XmlReader开关情况下

C# 如何修复';错误CS0165:使用未分配的局部变量';在XmlReader开关情况下,c#,xml,xmlreader,C#,Xml,Xmlreader,我尝试从Xml文件中读取数据。 我的计划是将所有学生作为学生的对象保存,并注明姓名和学期 <persons> <student><name>255211</name><semester>MI</semester></student> <student><name>255212</name><semester>MI</semester>&l

我尝试从Xml文件中读取数据。 我的计划是将所有学生作为学生的对象保存,并注明姓名和学期

<persons>
    <student><name>255211</name><semester>MI</semester></student>
    <student><name>255212</name><semester>MI</semester></student>
    <student><name>255213</name><semester>MI</semester></student>
</persons>
我现在的问题是Visual Studio代码给了我一个错误: 错误CS0165:使用未分配的局部变量“student”(在“name”的情况下为student.name)。我猜这是因为如果代码不在“student”中,就不会有student.name。我试着用try-catch,但没用

我如何才能确保每个学生的姓名和学期正确无误?

您仅在
案例中指定
学生
;从编译器的角度来看,
student
的“name”
的“学期”
案例开始时是未分配的,因此您不能对它们设置属性。您可能知道
总是排在第一位,但编译器不知道这一点。此外,从它的角度来看,每个元素的作用域是独立的。但是,如果您100%确定每个任务之间总是有一个
,那么您可能可以将任务移动一点:

Student student = null;
while (reader.Read())
{
    if (reader.NodeType == XmlNodeType.Element)
    {
        switch (reader.Name)
        {
            case "student":
                student = new Student();
                Students.Add(student);
                break;
            case "name":
                student.name = reader.ReadString();
                //Console.WriteLine(student.name);
                break;
            case "semester":
                student.semester = reader.ReadString();
                break;
        }
    }
}
然而,实际上,在大多数情况下,我强烈建议使用
XmlSerializer
或类似工具将输入解析为对象,然后将其作为对象处理

根据问题中的xml布局,这应该是可行的:

public class Student {
    [XmlElement("name")]
    public string Name {get;set;}
    [XmlElement("semester")]
    public string Semester {get;set;}
}
[XmlRoot("persons")]
public class SomeData {
    [XmlElement("student")]
    public List<Student> Students {get;} = new List<Student>();
}
公共班级学生{
[XmlElement(“名称”)]
公共字符串名称{get;set;}
[XmlElement(“学期”)]
公共字符串{get;set;}
}
[XmlRoot(“人员”)]
公共类数据{
[XmlElement(“学生”)]
公共列表学生{get;}=new List();
}
以及:

var ser=new-XmlSerializer(typeof(SomeData));
var data=(SomeData)序列反序列化(源);
列出学生=数据。学生;

可能重复:我删除了类似的答案。考虑到这一点,我更喜欢这个版本,如果违反了假设,它会抛出一个
NullReferenceException
,而不是继续,但它仍然只会将您从一个初始的前导
name
sement
元素中保存下来。@Damien\u不信者我的偏好实际上是我刚刚编辑的位:)
public class Student {
    [XmlElement("name")]
    public string Name {get;set;}
    [XmlElement("semester")]
    public string Semester {get;set;}
}
[XmlRoot("persons")]
public class SomeData {
    [XmlElement("student")]
    public List<Student> Students {get;} = new List<Student>();
}
var ser = new XmlSerializer(typeof(SomeData));
var data = (SomeData)ser.Deserialize(source);
List<Student> students = data.Students;