在格式化字符串(又名插值字符串)中使用三元运算符时出错 [重复]

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) &gt; 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++ 三元运算符中使用字符串常量是对非左值数组的无效使用吗?

为啥我不能在没有括号的插值字符串中使用条件运算符? [复制]

bytes数据类型,三元运算,进制互换

C# - 为啥我不能在字符串中使用三元运算符? [复制]

为啥三元条件不适用于字符串连接

为啥使用三元运算符返回字符串与在等效 if/else 块中返回的代码有很大不同?