2016-04-18 4 views
-5
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, чтобы я, где я получаю сообщение об ошибке, обнаруживаемых в названии - Свойство или indexer не может быть назначен - он только для чтения. Я просматривал многие подобные сообщения, но не смог найти решение. Любая помощь будет принята с благодарностью. Заранее спасибо!собственность или индексатор «NodaTime.LocalDateTime.Month» не может быть назначена - это только для чтения

+0

Какое решение вы хотите? Чтение документации? Это свойство доступно только для чтения. – TomTom

+0

Вы не можете изменить значение, изменив его свойство 'Month', попробуйте создать новый экземпляр. –

+0

Это не имеет смысла * логически * для изменения даты. Дата и время не изменяются. Вам нужно создать новое представление новой даты. – Rob

ответ

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, будет инициализирован значением по умолчанию, которое для LocalDateTime равно 1970-01-01 00:00:00.

Затем вы пытаетесь установить свойство, как если бы значение было изменчивым, но оно является неизменным, поэтому нет сеттера. Вместо этого вам нужно назначить новый экземпляр структуры 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 в статической переменной, чтобы избежать необходимости создавать его каждый раз. Это обеспечивает лучшую производительность, чем эквивалентные методы BCL, такие как DateTime.ParseExact.