只有赋值,调用,递增,递减,等待和新对象表达式才能用作语句

时间:2013-07-23 20:21:17

标签: c# c#-4.0

我有这个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 个答案:

答案 0 :(得分: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 / {}块的正文。没有支撑,这些块嵌套的方式不直观,并且会妨碍将来的维护。 (例如,你能告诉if块属于哪个else if块吗?继承这个项目的下一个人是否能够不仅能说出差异,还能理解什么是嵌套预期?明确表示!)

答案 1 :(得分:0)

您必须对表达式的结果执行某些操作(例如,将其分配给结果?!)

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

答案 2 :(得分:0)

result.StartsWith("/") && result.EndsWith("/") ? result.Replace("/", string.Empty) : result;

这一行对三元运算符的结果没有任何作用。我假设你想把它分配给结果

答案 3 :(得分: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 编译器平台)即时编译一段代码。

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

  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();

}