在 C# 中我可以用速记来做这样的事情吗?

 bool validName = true;
 if (validName)
 {
     name = "Daniel";
     surname = "Smith";
 }
 else
 {
     MessageBox.Show("Invalid name");
 }

我只是想知道类似的东西是否有效,但在这种情况下,我知道如果我这样做了 name = validName 你可以分配值?“丹尼尔”:“无效”,但我只是想知道我是否可以执行以下操作?

     validName ? 
     {
         name = "Daniel";
         surname = "Smith";
     } 
     : 
     {
         MessageBox.Show("Invalid name");
     }
有帮助吗?

解决方案

滥用 lambda 语法和类型推断:

(validName
    ? (Action)
        (() =>
            {
                name = "Daniel";
                surname = "Smith";
            })
      : () =>
           {
                MessageBox.Show("Invalid name");
           })();

我知道,这并不是真正的答案。如果语句更好:显然,这种语法的可读性较差,更重要的是,它具有不同的运行时行为,并且由于 lambda 表达式创建的潜在闭包,可能会导致意想不到的副作用。

语法也有点神秘。它首先创建两个 Action 然后对象 ?: 运算符在它们之间进行选择,最后执行选择的结果:

var a1 = new Action(() => { /* if code block */ });
var a2 = new Action(() => { /* else code block */ });

Action resultingAction = test_variable ? a1 : a2;

resultingAction();

我通过就地执行结果操作将其放在一个语句中。为了使其更简短,我将第一个 lambda 表达式转换为 Action (而不是创建一个 new Action() 明确地)并利用类型推断我省略了第二个强制转换。

其他提示

让我们说你可以这样做。为什么?

什么是动机?

更少的线条?不足以产生差异。 表现?没有,编译器将为您处理。 明晰?如果/ else更清晰,大多数开发人员更容易理解。

我相信,如果你努力工作,你可以找到一种方法来处理这个(最有可能是一个Kldude),但我仍然无法确定为什么。

no。

三元算子(?:)必须是一个表达式 - 即可以分配给某事的东西。

条件运算符需要其第二和第三操作数是返回值的表达式(除了满足某些类型限制之外),而不是不会解析为值的语句。您没有您希望从您目前执行的操作返回的值。

您可以返回一些荒谬的价值只是为了制作代码编译,但在那点,您可以在使用的是使用正确的语义运算符进行正确的语义运算符,因此您添加了更多的工作,所以虽然是正确的语义运算符从技术上讲,这不是一个好主意。

fullName = validName == true ? returnName(firstName)+" "+returnName(lastName) : validName == false ? invalidName("Invalid Name") : null


public string returnName(string name)
{
return name;
}

public string invalidName(string invalid)
{
MessageBox.Show(invalid);
return null;
}
.

因为其他人可能表示,这是你可能真正想做的事情,但是,有可能:p

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top