当前位置: 首页 > 知识库问答 >
问题:

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

闻人举
2023-03-14

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

< code >错误CS1003语法错误,应为“:*”。

我使用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个答案

葛昕
2023-03-14

我想Cᴏʀʏ已经回答了你的问题。但是万一我想给你一个不同的。

尝试<code>字符串。格式</code>:

控制台。WriteLine("{0}{1}", u, String. Compare(u, u2)

希望有帮助!

詹钊
2023-03-14

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

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

条件表达式需要用括号括起来,因为其中包含。通常,后跟一个格式化表达式,在这种情况下没有。

请尝试使用以下方法:

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

来自MSDN(重点是我的):

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

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

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

您可以。如果您真的很关心外壳,也可以使用To低()

 类似资料:
  • 我想创建一个日期时间字符串,但添加CET/CEST,具体取决于是否夏时制。 因此,如果返回true,则附加“CEST”字符串,如果不是,则仅附加“CET”。 有没有简单/快捷的方法来做这件事?

  • 现在的Rust资料,无论是Book还是RustByExample都没有统一而完全的介绍Rust的操作符。一个很重要的原因就是,Rust的操作符号和C++大部分都是一模一样的。 一元操作符 顾名思义,一元操作符是专门对一个Rust元素进行操纵的操作符,主要包括以下几个: -: 取负,专门用于数值类型。 *: 解引用。这是一个很有用的符号,和Deref(DerefMut)这个trait关联密切。 !:

  • 问题内容: 嗨,我只是想知道为什么这段代码(至少对我来说)产生错误的结果。 好吧,我可能在这里错了 我猜想,如果paperType等于“ Bond”,则说明为“ Paper:Bond”,如果paperType不等于“ Bond”,则说明为“ Paper:Other”。 但是,当我运行这段代码时,结果描述是“ Bond”还是“ Other”,让我想知道字符串“ Paper:”去了哪里??? 问题答案

  • 我试图在插值字符串中使用条件操作符,但是因为它有一个冒号,编译器认为冒号后面是一个格式字符串。 我如何使用这种类型的语句?我唯一想到的事情是这样的:

  • 问题内容: 我正在尝试将字符串“ 20091229050936”转换为“ 2009年12月29日(UTC)05:09” 给 显然,我犯了一个错误:时间是错误的,它是日期时间对象!它有一个日期 和 一个时间部分! 给 我如何将字符串转换为格式化的日期字符串? 问题答案: 返回一个; 接受作为可选参数: 给