财产或指数' NodaTime.LocalDateTime.Month'无法分配 - 它是只读的

时间:2016-04-18 06:06:59

标签: c# nodatime

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;
using System.IO;
using NodaTime;

namespace MyApp
{
    public partial class MainForm : Form
    {
        public class Foo
        {
            private LocalDateTime date_time;

            public Foo(string data)
            {
                Int32 i;
                char[] delimiters = { ',', '/', ':' };
                string[] tokens = data.Split(delimiters);

                if( Int32.TryParse(tokens[0], out i ))
                {
                    date_time.Month = i;
                }
            }
        };

        public MainForm()
        {
            InitializeComponent();
        }
    }
}

我将date_time.Month设置为i的行是我在标题中调用错误的地方 - 无法将属性或索引器分配给它 - 它是只读的。我搜索了很多类似的帖子,但无法找到解决方案。任何帮助将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果LocalDateTime是可变的,您可以这样做:

LocalDateTime x = new LocalDateTime();
x.Year = 2016;
x.Month = 4;
x.Day = 20;
x.Hour = 11;
x.Minute = 30;

但是,它并不可变。它是不可变的。因此,您必须这样做:

LocalDateTime x = new LocalDateTime(2016, 4, 20, 11, 30);

在您的代码中,您已在类中定义了一个字段date_time,并将其声明为LocalDateTime类型,但您从未为其分配过值。由于此类型为struct,因此将使用其默认值对其进行初始化,LocalDateTime1970-01-01 00:00:00

然后尝试设置一个属性,好像该值是可变的,但它是不可变的,因此没有setter。相反,您需要为字段分配LocalDateTime结构的新实例,与上面的显示类似。

同时认识到Noda Time内置了广泛的解析功能,因此无需将字符串拆分为组件或尝试将其解析为整数。例如:

using NodaTime;
using NodaTime.Text;

...

var pattern = LocalDateTimePattern.CreateWithInvariantCulture("M/d/yyyy HH:mm:ss");
var result = pattern.Parse("4/20/2016 11:30:00");
if (!result.Success)
{
    // handle error
}

LocalDateTime ldt = result.Value;

如果您要解析大量值,可以在静态变量中保留pattern实例,以避免每次都创建它。这提供了比DateTime.ParseExact等等BCL方法更好的性能。