【问题标题】:Compilation error: Only assignment, call, increment, decrement, and new object expressions can be used as a statement编译错误:只有赋值、调用、自增、自减、新对象表达式可以作为语句使用
【发布时间】:2019-08-30 09:08:34
【问题描述】:

我以前读过:

C# Only assignment, call, increment, decrement, and new object expressions can be used as a statement

Only assignment, call, increment, decrement, and new object expressions can be used as a statement and ; Expected

我正在写以下内容:

namespace Converter {
      public class Converter
      {
        public string dnaToRna(string dna)
        {
          string rna = "";
          foreach(char letter in dna){
            letter=='T' ? rna+='U' : rna+=letter;
            rna+=letter;
          }
          return rna;
        }
      }
    }

当我用测试调用代码时:

    namespace Converter {
  using NUnit.Framework;
  using System;

  [TestFixture]
  public class Test
  {
    [Test]
    public void test()
    {
      Converter converter = new Converter();
      Assert.AreEqual("UUUU", converter.dnaToRna("TTTT"));
    }
  }
}

上面写着:

src/Solution.cs(9,9): error CS0201: Only assignment, call, increment, decrement, and new object expressions can be used as a statement

但是,如果我将其替换为:

namespace Converter {
  public class Converter
  {
    public string dnaToRna(string dna)
    {
      string rna = "";
      foreach(char letter in dna){
        if(letter=='T'){
          rna+='U';
        }else{
          rna+=letter;
        }
      }
      return rna;
    }
  }
}

有效,为什么?

感谢您的帮助????????????。

【问题讨论】:

  • 条件运算符是一个表达式。它意味着返回一个。不包含任意其他陈述。
  • 这是你需要阅读文档的时间?: Operator (C# Reference)Fun level 100

标签: c#


【解决方案1】:

不正确:

letter=='T' ? rna+='U' : rna+=letter;

正确:

rna+= letter=='T' ? 'U' : letter;

【讨论】:

    【解决方案2】:

    ternary operator 应该返回一个值。它并不意味着替代 if 语句来执行代码。做任何其他事情都是side-effect,这就是改变它的意图之外的事情。
    与其在应该是两个可能的返回值之一期间进行更改,不如确定您想要的返回类型并使用它。

    rna += (letter=='T') ? 'U' : letter;
    

    【讨论】:

    • 这是不正确的。当然,您可以在三元语句中执行代码。关键是必须将结果分配给某些东西。该声明完全有效,并会给出 OP 预期的结果:rna = letter=='T' ? rna+='U' : rna+=letter;
    • @iakobski 仍然是不好的做法。我从来没有说过这是不可能的。你的代码没有意义。使用赋值的返回值是可怕的风格。
    【解决方案3】:

    您不应该在三元条件本身内执行赋值;你应该改用这个。

    rna += letter=='T' ? 'U' : letter;
    

    语法:

    Boolean Expression ? First Statement : Second Statement
    

    注意:

    三元运算符返回包含在它的第二部分或第三部分中的值或表达式。它不执行语句。

    【讨论】:

    • 你的第一个例子有什么帮助,括号与否,它只是不起作用
    • It does not execute the statements. 确实如此,否则它无法返回它们的值。这也不是三元运算符的有效语法,这是 导致 OP 编译错误的语法
    猜你喜欢
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多