C# 更改日期时间月份->&引用;list[i].date.Month=Int32.Parse(Console.ReadLine())&引用;

C# 更改日期时间月份->&引用;list[i].date.Month=Int32.Parse(Console.ReadLine())&引用;,c#,datetime,C#,Datetime,我正在尝试更改列表中日期时间的月份和日期 这是一节课: public string NomeCliente { get => nomeCliente; set => nomeCliente = value; } public int Hora { get => hora; set => hora = value; } public int Minutos { get => minutos; set => minutos = value; } public Da

我正在尝试更改列表中日期时间的月份和日期

这是一节课:

public string NomeCliente { get => nomeCliente; set => nomeCliente = value; }
public int Hora { get => hora; set => hora = value; }
public int Minutos { get => minutos; set => minutos = value; }
public DateTime Data { get => data; set => data = value; }
public int Campo { get => campo; set => campo = value; }
这是我的代码:

Console.Clear();
Console.Write("Novo nome cliente: ");
listaMarcacoes[pos].NomeCliente = Console.ReadLine();

Console.WriteLine("Insira o horário:");
Console.Write("\tHora: ");
listaMarcacoes[pos].Hora = Int32.Parse(Console.ReadLine());

Console.Write("\tMinutos: ");
listaMarcacoes[pos].Minutos = Int32.Parse(Console.ReadLine());

Console.Write("Insira o mês: ");
listaMarcacoes[pos].Data.Month = Int32.Parse(Console.ReadLine());

Console.Write("Insira o dia: ");
listaMarcacoes[pos].Data.Day = Int32.Parse(Console.ReadLine());

Console.Write("Insira o campo: ");
listaMarcacoes[pos].Campo = Int32.Parse(Console.ReadLine());

错误发生在“
listaMarcacoes[pos].Data.Month=Int32.Parse(Console.ReadLine());
”和“
listaMarcacoes[pos].Data.Day=Int32.Parse(Console.ReadLine());

正如@Clockwork Muse所说的,我必须创建一个新的日期时间,所以基本上我要做的就是将月份和日期保存在一个新变量上,然后将其发送到新的日期时间

像这样:

listaMarcacoes[pos].Data = new DateTime(var year, var month, var day);

在分配用户输入之前,始终验证用户输入

例如,以这一行为例:

Console.Write("\tMinutos: ");
listaMarcacoes[pos].Minutos = Int32.Parse(Console.ReadLine());
如果用户输入的不是数字,它会立即抛出异常

为了避免这种情况,您需要先存储该值,然后按如下方式进行验证:

var minutes = Console.ReadLine(); 
int _minutes = 0;

if(int.TryParse(minutes, out _minutes))
{
    listaMarcacoes[pos].Minutos = _minutes;
}
else 
{
    Console.Write("is not an integer, please make sure you enter numbers only.");
}
现在,您可以更进一步,根据用户输入扩展您的逻辑,并且将得到更好的处理

例如,由于时间是分钟,我们假设输入范围在0到60之间 然后我们可以这样做:

if(int.TryParse(minutes, out _minutes))
{
    if(_minutes >= 0 && _minutes <= 60)
    {
        listaMarcacoes[pos].Minutos = _minutes; 
    }
    else 
    {
        Console.Write("please choose a number between 0 and 60.");
    }
}
else 
{
    Console.Write("is not an integer, please make sure you enter numbers only.");
}
listaMarcacoes[pos].Data.Month = Int32.Parse(Console.ReadLine());
这将在类启动后创建一个新实例。或者只是在代码开始时启动

Data = new DateTime();
然后你可以这样做:

if(int.TryParse(minutes, out _minutes))
{
    if(_minutes >= 0 && _minutes <= 60)
    {
        listaMarcacoes[pos].Minutos = _minutes; 
    }
    else 
    {
        Console.Write("please choose a number between 0 and 60.");
    }
}
else 
{
    Console.Write("is not an integer, please make sure you enter numbers only.");
}
listaMarcacoes[pos].Data.Month = Int32.Parse(Console.ReadLine());

欢迎来到堆栈溢出。错误到底是什么?您在控制台上放了什么作为输入?确切地说,
listaMarcacoes
是什么?你能创建一个演示你的问题的模型吗?你有没有试过调试你的代码?我真的想建议你多读几遍,然后再问更多的问题你不能改变它。你必须创建一个新的
DateTime
(或者更可取的是,
DateTimeOffset
)对象,并将其分配给你的
数据
字段。DateTime.Month和DateTime.Day是只读属性-你不能给它们赋值。如果你有答案,请使用下面的“你的答案”框回答你的问题。不要在你的问题中添加答案或在标题中编辑“已解决”。谢谢。@HereticMonkey抱歉,我是堆栈溢出新手,我会这么做的哇,谢谢:)我忘记检查值了,准备向客户展示演示,似乎我必须检查代码中的一些内容。谢谢你!(我不能投票,但如果可以,我会投票)