5

我有这个 foreach 部分,我试图在“result = string.Format”之后添加一行,但我收到以下错误“只有赋值、调用、递增、递减、等待和新对象表达式可以用作语句“谁能告诉我我做错了什么。

foreach (DataRow record in table.Rows)
{
    string key = record["Code"] + "_" + record["Description"];
    int row = (int)rownum[key];

    string date = formatDate(record["ApptDate"].ToString(), "_");

    string result = string.Empty;
    if (record["Dosage"].ToString() != string.Empty)
        result = string.Format("{0}/{1}", test.SharedLib.Application.RemoveTrailingZeroes(record["Dosage"].ToString()), 
                                          test.SharedLib.Application.RemoveTrailingZeroes(record["Units"].ToString()));
    if (record["Dosage"].ToString() != string.Empty)
        result.StartsWith("/") && result.EndsWith("/") ? result.Replace("/", string.Empty) : result;
    else if (record["Units"].ToString() != string.Empty)
        result = record["Units"].ToString();

    dataTable.Rows[row]["ApptDate" + date] = result;
}
4

4 回答 4

5
if (record["Dosage"].ToString() != string.Empty)
    result.StartsWith("/") && result.EndsWith("/") ? result.Replace("/", string.Empty) : result;

第二行不是语句,是表达式。并非所有表达式都可以是 C# 中的语句,因此这是一个语法错误。

大概您打算将其结果分配给result

if (record["Dosage"].ToString() != string.Empty)
    result = (result.StartsWith("/") && result.EndsWith("/")) ? result.Replace("/", string.Empty) : result;

此外,您应该考虑将if/else块的主体用大括号 ( {}) 括起来。没有大括号,这些块的嵌套方式不直观,并且会妨碍将来的维护。(例如,你能说出块属于哪个ifelse if吗?继承这个项目的下一个人不仅能够分辨出区别,而且能够理解嵌套的意图吗?让它明确!)

于 2013-07-23T20:23:37.220 回答
1

您必须对表达式的结果做一些事情(例如将其分配给结果?!)

有关更多信息,您应该真正格式化并告诉我们更多关于您的代码的信息......所以用户不是您的个人编译器/调试器;-)

于 2013-07-23T20:23:29.347 回答
0
result.StartsWith("/") && result.EndsWith("/") ? result.Replace("/", string.Empty) : result;

该行对三元运算符的结果没有任何作用。我假设您想将其分配给结果

于 2013-07-23T20:24:01.597 回答
0

就我而言,我收到如下错误

Message=(1,1): error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement
  Source=Microsoft.CodeAnalysis.Scripting

当我调用以下方法时。

private static async Task TrialUsingRoslynScriptingApi1()
{
    var scriptOptions = ScriptOptions.Default;

    var assemblies = AppDomain.CurrentDomain.GetAssemblies(); // .SingleOrDefault(assembly => assembly.GetName().Name == "MyAssembly");

    foreach (Assembly assembly in assemblies)
        scriptOptions = scriptOptions.AddReferences(assembly);


    scriptOptions = scriptOptions.AddImports("System");
    scriptOptions = scriptOptions.AddImports("System.Collections.Generic");
   
    var codeString = @"iList =>
    {
        var finalResult = 0;

        foreach (var i in iList)
            finalResult = finalResult + i;

        return finalResult;
    };
    return arithmeticSum;";

    Func<List<int>, int> arithmeticSum = await CSharpScript.EvaluateAsync<Func<List<int>, int>>(codeString, scriptOptions);
        
    var iListOfNumbers = new List<int>() { 1, 2, 3, 4, 5 };

    Console.WriteLine(arithmeticSum.Invoke(iListOfNumbers));
    Console.WriteLine(arithmeticSum(iListOfNumbers));

}

为了缓解这种情况,我将 codeString 更改为以下内容。注意最后的 return 语句和开头的赋值。

var codeString = @"Func<List<int>, int> arithmeticSum = iList =>
    {
        var finalResult = 0;

        foreach (var i in iList)
            finalResult = finalResult + i;

        return finalResult;
    };
    return arithmeticSum;";

请注意,这不是一个常规用例,我正在尝试使用 roslyn(.NET Compiler platform) 即时编译一段代码。

要运行此示例,请执行以下操作。

  1. 在 .net core 上创建一个控制台应用程序
  2. 添加Microsoft.CodeAnalysis.CSharp.Scripting nuget包。
  3. 根据需要添加以下部分或全部 using 语句。

使用语句

using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
  1. 最后调用方法如下。

Program.cs 文件中的 main 方法应如下所示。

static async Task Main(string[] args)
{
    Console.WriteLine("Hello World! A demo of string to lambda with Roslyn");

    await TrialUsingRoslynScriptingApi1();

}
于 2021-06-14T08:31:34.277 回答