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

时间:2017-01-26 03:55:39

标签: c# compiler-errors

我编写了一个简单的程序,用于查找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;
    }
}

2 个答案:

答案 0 :(得分:2)

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

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

条件表达式必须由括号括起,因为:位于括号内。通常,:之后是格式化表达式,在这种情况下没有。

请尝试使用此代码:

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

来自MSDN(强调我的):

  

您不需要在包含的插值表达式中引用引号字符,因为插值字符串表达式以$开头,并且编译器将包含的插值表达式扫描为平衡文本,直到找到逗号,冒号或关闭大括号。 出于同样的原因,最后一个例子使用括号来允许条件表达式(p.Age == 1?&#34;&#34;:&#34; s&#34;)在插值表达式中没有冒号开始格式规范。

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

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

如果您真的关心套管,也可以.ToLower()

答案 1 :(得分:0)

我认为Cᴏʀʏ已经回答了你的问题。但万一你想要一个不同的人。

尝试String.Format

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

希望它有所帮助!