我有这个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;
}
答案 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 编译器平台)即时编译一段代码。
要运行此示例,请执行以下操作。
使用语句
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;
Program.cs 文件中的 Main 方法应如下所示。
static async Task Main(string[] args)
{
Console.WriteLine("Hello World! A demo of string to lambda with Roslyn");
await TrialUsingRoslynScriptingApi1();
}