@@ -135,6 +135,115 @@ static void Main(string[] args)
135135 ) ;
136136 }
137137
138+ [ Ignore ( "Property-based conversion detection not yet implemented - requires Roslyn IOperation tree investigation" ) ]
139+ [ TestMethod ]
140+ public void UsageOfImplicitConversion_WithProperties_ProducesWarningMessage ( )
141+ {
142+ string source = @"
143+ using System;
144+ using System.Collections.Generic;
145+ using System.Linq;
146+
147+ namespace ConsoleApp1
148+ {
149+ internal class Pair(DateTimeOffset DateTimeOffset, DateTime DateTime);
150+
151+ internal class Program
152+ {
153+ static void Main(string[] args)
154+ {
155+ Pair pair = new(DateTimeOffset.Now, DateTime.Now);
156+ _ = pair.DateTimeOffset < pair.DateTime;
157+ }
158+ }
159+ }" ;
160+
161+ VerifyCSharpDiagnostic (
162+ source ,
163+ new DiagnosticResult
164+ {
165+ Id = "INTL0202" ,
166+ Severity = DiagnosticSeverity . Warning ,
167+ Message = "Using the symbol 'DateTimeOffset.implicit operator DateTimeOffset(DateTime)' can result in unpredictable behavior" ,
168+ Locations = [ new DiagnosticResultLocation ( "Test0.cs" , 14 , 29 ) ]
169+ }
170+ ) ;
171+ }
172+
173+ [ Ignore ( "Property-based conversion detection not yet implemented - requires Roslyn IOperation tree investigation" ) ]
174+ [ TestMethod ]
175+ public void UsageOfImplicitConversion_WithPropertiesInLinq_ProducesWarningMessage ( )
176+ {
177+ string source = @"
178+ using System;
179+ using System.Collections.Generic;
180+ using System.Linq;
181+
182+ namespace ConsoleApp1
183+ {
184+ internal class Pair(DateTimeOffset DateTimeOffset, DateTime DateTime);
185+
186+ internal class Program
187+ {
188+ static void Main(string[] args)
189+ {
190+ List<Pair> list = new(){ new(DateTimeOffset.Now, DateTime.Now) };
191+ _ = list.Where(pair => pair.DateTimeOffset < pair.DateTime);
192+ }
193+ }
194+ }" ;
195+
196+ VerifyCSharpDiagnostic (
197+ source ,
198+ new DiagnosticResult
199+ {
200+ Id = "INTL0202" ,
201+ Severity = DiagnosticSeverity . Warning ,
202+ Message = "Using the symbol 'DateTimeOffset.implicit operator DateTimeOffset(DateTime)' can result in unpredictable behavior" ,
203+ Locations = [ new DiagnosticResultLocation ( "Test0.cs" , 14 , 42 ) ]
204+ }
205+ ) ;
206+ }
207+
208+ [ Ignore ( "Property-based conversion detection not yet implemented - requires Roslyn IOperation tree investigation" ) ]
209+ [ TestMethod ]
210+ public void UsageOfImplicitConversion_InLinqWithVariables_ProducesWarningMessage ( )
211+ {
212+ string source = @"
213+ using System;
214+ using System.Collections.Generic;
215+ using System.Linq;
216+
217+ namespace ConsoleApp1
218+ {
219+ internal class Pair(DateTimeOffset DateTimeOffset, DateTime DateTime);
220+
221+ internal class Program
222+ {
223+ static void Main(string[] args)
224+ {
225+ List<Pair> list = new(){ new(DateTimeOffset.Now, DateTime.Now) };
226+ _ = list.Where(pair => {
227+ DateTimeOffset first = pair.DateTimeOffset;
228+ DateTime second = pair.DateTime;
229+ return first < second;
230+ });
231+ }
232+ }
233+ }" ;
234+
235+ VerifyCSharpDiagnostic (
236+ source ,
237+ new DiagnosticResult
238+ {
239+ Id = "INTL0202" ,
240+ Severity = DiagnosticSeverity . Warning ,
241+ Message = "Using the symbol 'DateTimeOffset.implicit operator DateTimeOffset(DateTime)' can result in unpredictable behavior" ,
242+ Locations = [ new DiagnosticResultLocation ( "Test0.cs" , 18 , 24 ) ]
243+ }
244+ ) ;
245+ }
246+
138247 [ TestMethod ]
139248 public void UsageOfExplicitConversion_ProducesNothing ( )
140249 {
@@ -156,6 +265,52 @@ static void Main(string[] args)
156265
157266 }
158267
268+ [ Ignore ( "Property-based conversion detection not yet implemented - requires Roslyn IOperation tree investigation" ) ]
269+ [ TestMethod ]
270+ public void UsageInLambdaWithDateProperty_ProducesWarningMessage ( )
271+ {
272+ // This test matches the original issue scenario
273+ string source = @"
274+ using System;
275+ using System.Linq;
276+
277+ namespace Test
278+ {
279+ public class TimeEntry
280+ {
281+ public DateTimeOffset EndDate { get; set; }
282+ public DateTimeOffset StartDate { get; set; }
283+ }
284+
285+ public class DataSource
286+ {
287+ public IQueryable<TimeEntry> GetQuery(DateTime startDate, DateTime endDate)
288+ {
289+ return Enumerable.Empty<TimeEntry>().AsQueryable()
290+ .Where(te =>
291+ te.EndDate <= endDate.Date.AddDays(1).AddTicks(-1) &&
292+ te.StartDate >= startDate.Date);
293+ }
294+ }
295+ }" ;
296+
297+ VerifyCSharpDiagnostic ( source ,
298+ new DiagnosticResult
299+ {
300+ Id = "INTL0202" ,
301+ Severity = DiagnosticSeverity . Warning ,
302+ Message = "Using the symbol 'DateTimeOffset.implicit operator DateTimeOffset(DateTime)' can result in unpredictable behavior" ,
303+ Locations = [ new DiagnosticResultLocation ( "Test0.cs" , 18 , 35 ) ]
304+ } ,
305+ new DiagnosticResult
306+ {
307+ Id = "INTL0202" ,
308+ Severity = DiagnosticSeverity . Warning ,
309+ Message = "Using the symbol 'DateTimeOffset.implicit operator DateTimeOffset(DateTime)' can result in unpredictable behavior" ,
310+ Locations = [ new DiagnosticResultLocation ( "Test0.cs" , 19 , 38 ) ]
311+ } ) ;
312+ }
313+
159314 protected override DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer ( )
160315 {
161316 return new Analyzers . BanImplicitDateTimeToDateTimeOffsetConversion ( ) ;
0 commit comments