在 C# 中创建元组时编译错误,没有括号包围三元运算符

Posted

技术标签:

【中文标题】在 C# 中创建元组时编译错误,没有括号包围三元运算符【英文标题】:Compile error without brackets surrounding ternary operator when creating Tuples in C# 【发布时间】:2017-08-10 22:01:20 【问题描述】:

我在使用新元组功能的 C# 中遇到错误。如果我使用三元运算符来确定元组的值,我必须用括号括起来。我没想到会这样,因为在方法调用中并非如此。

这是有什么原因吗?还是一个错误?

设置:

Visual Studio 2017 .Net Standard 1.6 类库 System.ValueTuple(v4.3.0 - 来自 Nuget)

我的代码:

public class Test

    public bool Ok  get; set; 
    public string Text  get; set; 


public class Class1

    public void TestMethod()
    
        //
        // FROM OBJECT
        //
        Test obj = new Test()  Ok = true, Text = "asdf" ;

        StringMethod(true, obj.Ok ? obj.Text : "fsda");      // <-- OK
        var result1 = (true, obj.Ok ? obj.Text : "fsda");    // <-- Error
        var result2 = (true, (obj.Ok ? obj.Text : "fsda"));  // <-- OK (Same as line above, but with addional brackets)


        //
        // FROM OTHER TUPLE
        // 
        var tuple = OtherTuple();

        StringMethod(true, tuple.ok ? tuple.text : "fdsa");     // <-- OK
        var result3 = (true, tuple.ok ? tuple.text : "fdsa");   // <-- Error
        var result4 = (true, (tuple.ok ? tuple.text : "fdsa")); // <-- OK (Same as line above, but with addional brackets)
    

    public void StringMethod(bool state, string anyString)
    

    

    public (bool ok, string text) OtherTuple()
    
        return (true, "asdf");
    

【问题讨论】:

github.com/dotnet/roslyn/pull/16834 还有github.com/dotnet/roslyn/issues/17135 【参考方案1】:

我认为 var 无法定义您正在尝试在此行上设置元组的值

 var result3 = (true, tuple.ok ? tuple.text : "fdsa");  

也许如果你像这样更清楚:

 var result3 = Tuple.Create(true, tuple.ok ? tuple.text : "fdsa");  

这使代码易于阅读。

【讨论】:

以上是关于在 C# 中创建元组时编译错误,没有括号包围三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

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

JavaScript - 为啥包含括号会导致三元表达式错误?

mysql. 小括号绕过

如果没有大括号的代码块,C# 是不是支持?

创建没有标记的资源组时 Azure Policy 的奇怪行为

在 C# 三元运算符中给出错误:只有赋值、调用、递增、递减和新对象表达式可以用作语句