C# roslyn CSharpScript中的DateTime返回'expecting;'

C# roslyn CSharpScript中的DateTime返回'expecting;',c#,roslyn,csharpscript,C#,Roslyn,Csharpscript,在roslyn CSharpScript计算器中使用DateTime会返回错误代码'Expected;'虽然弦很好用 将Visual Studio 2019与Microsoft.CodeAnalysis.Common和Microsoft.CodeAnalysis.CSharp.Scripting 3.3.1一起使用 了解到evaluator需要配置,添加了DateTime程序集和自定义类程序集 public class Install { public int Insta

在roslyn CSharpScript计算器中使用DateTime会返回错误代码'Expected;'虽然弦很好用

将Visual Studio 2019与Microsoft.CodeAnalysis.Common和Microsoft.CodeAnalysis.CSharp.Scripting 3.3.1一起使用

了解到evaluator需要配置,添加了DateTime程序集和自定义类程序集

public class Install
    {
        public int InstallId { get; set; }
        public int RegistrationId { get; set; }
        public int EnvironmentId { get; set; }
        public DateTime SubmitDateTime { get; set; }
        public string SubmitIdentity { get; set; }
        public DateTime TargetDateTime { get; set; }
        public string InstallerIdentity { get; set; }
        public DateTime? StartDateTime { get; set; }
        public DateTime? StopDateTime { get; set; }
        public string Status { get; set; }
    }
此处无法理解基本DateTime对象导致问题的原因

字符串解析为i=>i.TargetDateTime>2019年10月25日上午11:00:00。用引号括起来会将其解释为字符串


编辑:我应该补充一点,将字符串硬编码到上面的示例中也会失败,并显示相同的错误消息,这让我相信这是一个解析问题?不确定如何处理DateTime对象中的字符?

问题正如您所说的-字符串解析为i=>i.TargetDateTime>10/25/2019 11:00:00 AM,这不是有效的C代码。即使添加了引号,也无法直接将日期时间与字符串进行比较

最终,您需要比较相同类型的对象。字符串到字符串、DateTime到DateTime、long到long等等。我更喜欢将它们作为DateTime对象

因此,需要在表达式的右侧构造DateTime

一种方法是使用DateTime构造函数,如下所示:

queryText = $"i => i.TargetDateTime > new System.DateTime({fooPast.Ticks}, System.DateTimeKind.{fooPast.Kind})";
另一种可能更干净的机制是通过内置的二进制序列化方法,该方法在单个值中同时考虑了记号和种类:

queryText = $"i => i.TargetDateTime > System.DateTime.FromBinary({fooPast.ToBinary()})";

为什么要投反对票?真的,请提供一个解释,这样我将来可以更好地起草问题。不要只是下箭头和插销。这有什么帮助?你希望这里会发生什么?您使用的是字符串插值,它调用传递给它的对象上的ToString。在DateTime的情况下,您会得到一个日期字符串,正如您所看到的那样。@Herohtar-这并不是一个坏问题。将鼠标悬停在“向上投票/向下投票”按钮上可阅读工具提示。这个问题是否符合显示研究、清晰和有用的标准?我想是的。如果您在每种情况下都检查queryText获取的值,我希望在调试器中可以很容易地看出这个问题的原因。我没有投反对票,但我可以看到有人看到了这个问题,认为他没有尝试调试它。@MattJohnson Pint问题本质上是为什么评估I.TargetDateTime>2019年10月25日11:00:00 AM会导致错误?。这是个好问题吗?这显然不是有效的C语句。我尝试了Matt发布的二进制解决方案:{1,45:错误CS0426:类型“DateTime”中不存在类型名“FromBinary”}将尝试第一种变体。谢谢。@Badchenn你在用什么平台。Net框架。净核心。净标准?什么版本?这种方法确实存在。事实上,-DOTNETCORE 3.0还可以。发现在字符串中调用.ToBinary是不可接受的。然而,我很容易在上面的变量声明中调用它。所以变量foopasst不是二进制的。但是,编译再次失败:queryText i=>i.Status\Complete\&&i.TargetDateTime>new System.DateTime.FromBinary-8586301823432291125错误:+ex{1,15:ERROR CS1002:;应为}Microsoft.code分析.Scripting。CompilationErrorException@Badchenni.Status\Complete\在我看来不是有效的C代码。
queryText = $"i => i.TargetDateTime > System.DateTime.FromBinary({fooPast.ToBinary()})";