0

我只是在学习如何使用 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);

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

4

2 回答 2

0

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

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

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

于 2022-02-19T18:41:41.077 回答
0

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

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

代替:

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

于 2022-02-19T18:36:04.973 回答