在格式化字符串(又名插值字符串)中使用三元运算符时出错 [重复]
Posted
技术标签:
【中文标题】在格式化字符串(又名插值字符串)中使用三元运算符时出错 [重复]【英文标题】:error when using ternary operator in formatting string (aka interpolated string) [duplicate] 【发布时间】:2017-06-11 12:32:08 【问题描述】:我编写了一个简单的程序来查找string
的最小排列,它在字典上大于当前排列。但是,编译器会发出错误
ERROR CS1003 Syntax error, ':' expected* ".
我使用 VS 2015(更新 3),每当我编译这个程序(这在语法上似乎是正确的)时,我都会遇到上述错误。
这个程序有语法错误吗?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
static void Main(string[] args)
const string a = "ABCDEFG";
//var u = FFG(a);
//var t = int.Parse(Console.ReadLine());
//for (int i = 0; i < t; i++)
//
// Console.WriteLine(FFG(Console.ReadLine()));
//
string u2 = a;
string u = a;
do
//***The follownig line meets Error***
Console.WriteLine(u + $"String.Compare(u, u2) > 0 ? true:false");
while ((u = FFG(u)) != "no answer");
Console.ReadLine();
static string FFG(string ss)
var s = ss.ToCharArray();
int i = s.Length - 1;
while (i >= 1 && s[i] <= s[(i--) - 1])
if (i == 0 && s[0] >= s[1])
return "no answer";
int j = s.Length - 1;
while (s[i] >= s[(j--)])
j++;
swap(s, i, j);
int t = i + 1, tt = s.Length - 1;
if (j - i >= 2)
while (t < tt)
//if (t == j)
// t++;
//if (tt == j)
// tt--;
swap(s, t, tt);
t++; tt--;
return new string(s);
static void swap<T>(T[] array, int i, int j)
T k = array[i];
array[i] = array[j]; array[j] = k;
【问题讨论】:
【参考方案1】:我想 Cᴏʀʏ 已经回答了你的问题。但万一想给你一个不同的。
试试String.Format
:
Console.WriteLine("01", u, String.Compare(u, u2) > 0 ? true : false);
希望对你有帮助!
【讨论】:
哦,不知道。谢谢!【参考方案2】:这不是编译器错误。问题是您拥有的内插字符串格式:
$"String.Compare(u, u2) > 0 ? true:false"
由于:
在里面,条件表达式需要用括号括起来。通常,:
后跟一个格式化表达式,在这种情况下没有。
尝试改用这个:
$"(String.Compare(u, u2) > 0 ? true:false)"
来自MSDN(强调我的):
您不需要在包含的插值表达式中引用引号字符,因为插值字符串表达式以 $ 开头,编译器将包含的插值表达式作为平衡文本扫描,直到找到逗号、冒号或右大括号。 出于同样的原因,最后一个示例使用括号来允许条件表达式 (p.Age == 1 ? "" : "s") 位于插值表达式内,而冒号不作为格式规范的开头。
对于它的价值,在我看来,在这里使用插值字符串是不必要的。字符串比较的结果可能对调试有用,所以我会将其移出字符串。此外,Console.WriteLine
已经被重载以接受格式字符串和令牌,因此我会将您的控制台输出逻辑更改为:
do
var comparisonResult = string.Compare(u, u2) > 0;
Console.WriteLine("0 1", u, comparisonResult);
...
如果你真的关心外壳,你也可以.ToLower()
。
【讨论】:
+1 对经典的“它一定是编译器错误”问题的温和回答。很容易变得尖酸刻薄,而且正确而彻底。相反,你很善良。干得好! 是的,还有更多选项可供选择,例如您提到的选项(甚至更简短的选项);但令我惊讶的是“为什么这种特殊形式的插值字符串不起作用?” ,你简明扼要地停止了我的惊讶!谢谢 有趣的是,您必须像编译器一样思考才能知道为什么这不是编译器错误 :) 很高兴我能提供帮助。以上是关于在格式化字符串(又名插值字符串)中使用三元运算符时出错 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 三元运算符中使用字符串常量是对非左值数组的无效使用吗?