【问题标题】:Roslyn CSharpScript EvaluateAsync Returns False When Statement Should Be True当语句应该为真时,Roslyn CSharpScript EvaluateAsync 返回 False
【发布时间】:2022-07-28 19:50:53
【问题描述】:

我只是在学习如何使用 Roslyn,我有一个这样的脚本:

var id = Guid.NewGuid();
string condition = $@"new List<Guid> {{ new Guid(""{Guid.NewGuid()}""), new Guid(""{id}"") }}.Any(id => id == new Guid(""{id}""));";

var result = CSharpScript.EvaluateAsync<bool>(condition, 
             Microsoft.CodeAnalysis.Scripting.ScriptOptions.Default
             .WithImports("System", "System.Collections.Generic", "System.Linq")
             .AddReferences(typeof(System.Linq.Enumerable).Assembly)).Result;

结果返回为假。我什至尝试过:

var id = Guid.NewGuid();
string condition = $@"new List<Guid> {{ new Guid(""{Guid.NewGuid()}""), new Guid(""{id}"") }}.Any(id => true);";

它也会导致错误。我对其进行了调试并在条件中获取了值,然后将转义字符取出后,它是:

var result = new List<Guid> { new Guid("907eb45d-8646-4b1b-baed-54d451f9753a"),
               new Guid("fef76d20-0066-4ee5-901e-2936c2117a8a") }.Any(id => true);

结果为真。我不确定我哪里出了问题。

【问题讨论】:

    标签: c# roslyn csharpscript


    【解决方案1】:

    不知道为什么,但是在语句末尾删除分号允许它返回 true。

    string condition = $@"new List&lt;Guid&gt; {{ new Guid(""{Guid.NewGuid()}""), new Guid(""{id}"") }}.Any(id =&gt; id == new Guid(""{id}""))";

    代替:

    string condition = $@"new List&lt;Guid&gt; {{ new Guid(""{Guid.NewGuid()}""), new Guid(""{id}"") }}.Any(id =&gt; id == new Guid(""{id}""));";

    【讨论】:

      【解决方案2】:

      EvaluateAsync 是一个异步函数。它不会立即返回数据。您需要在它之前放置 await 关键字以等待计算。

      如果您不这样做,当您在EvaluateAsync 返回之前检查它时,result 变量将使用默认值 false 初始化。

      var result = await CSharpScript.EvaluateAsync<bool>(condition, 
                   Microsoft.CodeAnalysis.Scripting.ScriptOptions.Default
                   .WithImports("System", "System.Collections.Generic", "System.Linq")
                   .AddReferences(typeof(System.Linq.Enumerable).Assembly)).Result;
      

      您可以在此处阅读有关异步编程的更多信息:https://docs.microsoft.com/en-us/dotnet/csharp/async

      【讨论】:

      • 这是不正确的。我能够在不等待的情况下访问结果,它根据 eval 中的语句返回正确的布尔值。正如我在回答中所说,问题是分号。
      【解决方案3】:

      因为你没有得到返回值。代码应该如下。

      string condition = $@"return new List<Guid> {{ new Guid(""{Guid.NewGuid()}""), new Guid(""{id}"") }}.Any(id => id == new Guid(""{id}""));";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-30
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        • 2013-09-05
        • 1970-01-01
        • 2013-03-23
        • 2020-12-10
        相关资源
        最近更新 更多