C# 在格式化字符串(也称为插值字符串)中使用三元运算符时出错

C# 在格式化字符串(也称为插值字符串)中使用三元运算符时出错,c#,compiler-errors,C#,Compiler Errors,我编写了一个简单的程序,用于查找字符串的最小排列,该字符串在词典上比当前字符串大。但是,编译器会发出错误 错误CS1003语法错误,':“预期*” 我使用VS2015(更新3),每当我编译这个程序(语法上似乎是正确的),我都会遇到前面提到的错误 这个程序有语法错误吗 using System; using System.Collections.Generic; using System.Linq; using System.Text; class Program { static vo

我编写了一个简单的程序,用于查找
字符串
的最小排列,该字符串在词典上比当前字符串大。但是,编译器会发出错误

错误CS1003语法错误,':“预期*”

我使用VS2015(更新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;
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
班级计划
{
静态void Main(字符串[]参数)
{
常量字符串a=“ABCDEFG”;
//var u=FFG(a);
//var t=int.Parse(Console.ReadLine());
//for(int i=0;i0?true:false}”);
}而((u=FFG(u))!=“没有答案”);
Console.ReadLine();
}
静态字符串FFG(字符串ss)
{
var s=ss.ToCharArray();
int i=s.长度-1;
而(i>=1&&s[i]=s[1])
返回“无应答”;
int j=s.长度-1;
而(s[i]>=s[(j-)])
{ }
j++;
互换(s、i、j);
int t=i+1,tt=s.长度-1;
如果(j-i>=2)
while(t
这不是编译器错误。问题在于您的插值字符串格式:

$"{String.Compare(u, u2) > 0 ? true:false}"
条件表达式需要用括号括起来,因为里面有
。通常,
后面跟一个格式化表达式,在本例中没有格式表达式

请尝试使用此选项:

$"{(String.Compare(u, u2) > 0 ? true:false)}"
来自(我的):

您不需要在包含的插值表达式中引用引号字符,因为插值字符串表达式以$开头,编译器将包含的插值表达式作为平衡文本进行扫描,直到找到逗号、冒号或右大括号。出于同样的原因,最后一个示例使用括号s以允许条件表达式(p.Age==1?“:“s”)位于插值表达式内,而无需冒号启动格式规范。

值得一提的是,在我看来,在这里使用插值字符串是不必要的。字符串比较的结果可能对调试有用,因此我将其从字符串中移出。此外,
Console.WriteLine已经重载以接受格式字符串和标记,因此我将把控制台输出逻辑更改为:

do 
{
    var comparisonResult = string.Compare(u, u2) > 0;
    Console.WriteLine("{0} {1}", u, comparisonResult);
} ...

如果您真的关心大小写,您也可以
.ToLower()

这不是编译器错误。问题是您的插值字符串格式:

$"{String.Compare(u, u2) > 0 ? true:false}"
条件表达式需要用括号括起来,因为里面有
。通常,
后面跟一个格式化表达式,在本例中没有格式表达式

请尝试使用此选项:

$"{(String.Compare(u, u2) > 0 ? true:false)}"
来自(我的):

您不需要在包含的插值表达式中引用引号字符,因为插值字符串表达式以$开头,编译器将包含的插值表达式作为平衡文本进行扫描,直到找到逗号、冒号或右大括号。出于同样的原因,最后一个示例使用括号s以允许条件表达式(p.Age==1?“:“s”)位于插值表达式内,而无需冒号启动格式规范。

值得一提的是,在我看来,在这里使用插值字符串是不必要的。字符串比较的结果可能对调试有用,因此我将其从字符串中移出。此外,
Console.WriteLine已经重载以接受格式字符串和标记,因此我将把控制台输出逻辑更改为:

do 
{
    var comparisonResult = string.Compare(u, u2) > 0;
    Console.WriteLine("{0} {1}", u, comparisonResult);
} ...

如果你真的关心外壳的话,你也可以
.ToLower()

我认为Cᴏ我已经回答了你的问题,但万一你想换一个

请尝试
String.Format

Console.WriteLine(“{0}{1}”,u,String.Compare(u,u2)>0?true:false);


希望能有帮助!

我认为Cᴏ我已经回答了你的问题,但万一你想换一个

请尝试
String.Format

Console.WriteLine(“{0}{1}”,u,String.Compare(u,u2)>0?true:false);


希望有帮助!

哦,我不知道。谢谢!哦,我不知道。谢谢!+1对一个经典的“这一定是一个编译器错误”问题给出了温和的回答。这很容易变得尖刻、正确和彻底。相反,你很善良。干得好!是的,有更多的选项可供选择,比如你提到的选项(还有更简短的问题);但让我惊讶的是“为什么这种特殊形式的插值字符串不起作用?”,你简洁地停止了我的惊讶!非常感谢,你必须像一个编译器那样思考,才能知道为什么这不是一个编译错误:)很高兴我能帮上忙。+1对于一个经典的“这一定是一个编译器错误”问题的温和回答。它会很容易变得尖刻、正确和彻底。相反,你是善良的。干得好!是的,有更多的选项可供选择,比如你提到的一个(甚至更简短的);但让我惊讶的是“为什么会这样?”