diff --git a/Ical.Net.Tests/RecurrenceTests.cs b/Ical.Net.Tests/RecurrenceTests.cs index e0f89cc8..212848ef 100644 --- a/Ical.Net.Tests/RecurrenceTests.cs +++ b/Ical.Net.Tests/RecurrenceTests.cs @@ -3570,7 +3570,7 @@ public void UntilTimeZoneSerializationTests(string tzId, DateTimeKind expectedKi Assert.That(serialized.Contains(expectedContains), Is.True); - var deserializedKind = Calendar.Load(serialized).Events.First().RecurrenceRules.First().Until.Kind; + var deserializedKind = Calendar.Load(serialized).Events.First().RecurrenceRules.First().Until?.Kind; Assert.That(deserializedKind, Is.EqualTo(expectedKind)); } diff --git a/Ical.Net/DataTypes/RecurrencePattern.cs b/Ical.Net/DataTypes/RecurrencePattern.cs index 79dc07fb..da77b738 100644 --- a/Ical.Net/DataTypes/RecurrencePattern.cs +++ b/Ical.Net/DataTypes/RecurrencePattern.cs @@ -3,6 +3,7 @@ // Licensed under the MIT license. // +#nullable enable using System; using System.Collections.Generic; using System.IO; @@ -26,20 +27,7 @@ public class RecurrencePattern : EncodableDataType #pragma warning restore 0618 public FrequencyType Frequency { get; set; } - private DateTime _until = DateTime.MinValue; - public DateTime Until - { - get => _until; - set - { - if (_until == value && _until.Kind == value.Kind) - { - return; - } - - _until = value; - } - } + public DateTime? Until { get; set; } public int Count { get; set; } = int.MinValue; @@ -146,7 +134,8 @@ public RecurrencePattern(string value) : this() return; } var serializer = new RecurrencePatternSerializer(); - CopyFrom(serializer.Deserialize(new StringReader(value)) as ICopyable); + if (serializer.Deserialize(new StringReader(value)) is ICopyable deserialized) + CopyFrom(deserialized); } public override string ToString() @@ -174,7 +163,7 @@ protected bool Equals(RecurrencePattern other) => (Interval == other.Interval) && CollectionEquals(ByMonth, other.ByMonth) && CollectionEquals(BySetPosition, other.BySetPosition); - public override bool Equals(object obj) + public override bool Equals(object? obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; @@ -237,4 +226,4 @@ public override void CopyFrom(ICopyable obj) } private static bool CollectionEquals(IEnumerable c1, IEnumerable c2) => c1.SequenceEqual(c2); -} \ No newline at end of file +} diff --git a/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs b/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs index 046cb540..82f9e307 100644 --- a/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs +++ b/Ical.Net/Evaluation/RecurrencePatternEvaluator.cs @@ -29,9 +29,9 @@ private RecurrencePattern ProcessRecurrencePattern(IDateTime referenceDate) r.CopyFrom(Pattern); // Convert the UNTIL value to one that matches the same time information as the reference date - if (r.Until != DateTime.MinValue) + if (r.Until is not null) { - r.Until = MatchTimeZone(referenceDate, r.Until); + r.Until = MatchTimeZone(referenceDate, r.Until.Value); } if (referenceDate.HasTime) @@ -243,10 +243,10 @@ private IEnumerable EnumerateDates(DateTime originalDate, DateTime see var noCandidateIncrementCount = 0; var candidate = DateTime.MinValue; - int dateCount = 0; + var dateCount = 0; while (maxCount < 0 || dateCount < maxCount) { - if (pattern.Until != DateTime.MinValue && candidate != DateTime.MinValue && candidate > pattern.Until) + if (pattern.Until is not null && candidate != DateTime.MinValue && candidate > pattern.Until) { break; } @@ -291,7 +291,7 @@ private IEnumerable EnumerateDates(DateTime originalDate, DateTime see continue; } - if (pattern.Until == DateTime.MinValue || candidate <= pattern.Until) + if (pattern.Until is null || candidate <= pattern.Until) { yield return candidate; dateCount++; diff --git a/Ical.Net/Serialization/DataTypes/RecurrencePatternSerializer.cs b/Ical.Net/Serialization/DataTypes/RecurrencePatternSerializer.cs index de00fe31..647a9b1e 100644 --- a/Ical.Net/Serialization/DataTypes/RecurrencePatternSerializer.cs +++ b/Ical.Net/Serialization/DataTypes/RecurrencePatternSerializer.cs @@ -83,9 +83,10 @@ public virtual void CheckMutuallyExclusive(string name1, string name2, T // that to be unassigned. var t1 = obj1.GetType(); + var t2 = obj2.GetType(); var fi1 = t1.GetField("MinValue"); - var fi2 = t1.GetField("MinValue"); + var fi2 = t2.GetField("MinValue"); var isMin1 = fi1 != null && obj1.Equals(fi1.GetValue(null)); var isMin2 = fi2 != null && obj2.Equals(fi2.GetValue(null)); @@ -142,13 +143,13 @@ public override string SerializeToString(object obj) values.Add("INTERVAL=" + interval); } - if (recur.Until != DateTime.MinValue) + if (recur.Until is not null) { var serializer = factory.Build(typeof(IDateTime), SerializationContext) as IStringSerializer; if (serializer != null) { - var until = new CalDateTime(DateOnly.FromDateTime(recur.Until), TimeOnly.FromDateTime(recur.Until), - recur.Until.Kind == DateTimeKind.Utc ? "UTC" : null); + var until = new CalDateTime(DateOnly.FromDateTime(recur.Until.Value), TimeOnly.FromDateTime(recur.Until.Value), + recur.Until.Value.Kind == DateTimeKind.Utc ? "UTC" : null); values.Add("UNTIL=" + serializer.SerializeToString(until)); }