6

在 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");
     }
4

5 回答 5

10

滥用 lambda 语法和类型推断:

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

我知道,并不是真正的答案。if 语句要好得多:显然这种语法可读性较差,更重要的是它具有不同的运行时行为,并且由于 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())并利用类型推断,我省略了第二个转换。

于 2014-07-30T16:54:16.267 回答
6

不。

三元运算符(?

于 2014-07-30T16:34:11.760 回答
6

假设你可以做到这一点。为什么?

动机是什么?

线少?不足以有所作为。表现?没有,编译器会为你处理事情。明晰?if/else 对大多数开发人员来说更清晰、更容易理解。

我敢肯定,如果你足够努力,你可以找到一种方法来处理这个问题(很可能是一个 kludge),但我仍然无法确定原因。

于 2014-07-30T16:36:48.213 回答
4

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

您可以仅仅为了使代码编译而返回一些无意义的值,但是此时您要添加大量工作,而不仅仅是使用if满足您要求的正确语义运算符,因此虽然在技术上是可行的,但它这不是一个好主意。

于 2014-07-30T16:35:21.810 回答
1
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

于 2014-07-30T16:48:02.050 回答