运营商: “布尔++” 在C#
问题描述:
public void Main()
{
int i = 0;
Console.WriteLine($"I was {i++}, now I is {i}");
bool b = true;
Console.WriteLine($"B was {b}, now B is {b}");
}
//I was 0, now I is 1
//B was True, now B is True
是否有改变B
值 “内联” 的可能性?
实际的需要:在在线剃刀
bool isActive = true;
@foreach(var item in list) {
<li class="@(isActive-- ? "active": "")">...
}
生产
<li class="active">...
<li class="">...
<li class="">...
<li class="">...
<li class="">...
解决方法的实际例子与integers
:
int isActive = 1;
@foreach(var item in list) {
<li class="@(isActive-- > 0 ? "active": "")">...
}
答
您应该能够使用@( )表达语法:
<li class="@(isActive ? "active" : " ")">My link here</li>
答
您可以直接应用赋值运算符。它返回指定值:
// b = !b both assigns false to b and returns assigned value
Console.WriteLine($"B was {b}, now B is {b = !b}");
// B was True, now B is False
为了您的Razor视图例如,您可以(AB)使用这样的:
bool active = true;
Console.WriteLine($"B is {(active ? (active = false) ? "" :"active" : "")}");
Console.WriteLine($"B is {(active ? (active = false) ? "" : "active" : "")}");
Console.WriteLine($"B is {(active ? (active = false) ? "" : "active" : "")}");
// outputs B is active
// B is
// B is
不,我建议这一点,但正如你所说的,它只是一个语言问题。
答
inlining
在改变if-conditition
变量的意义上是可能的。
var b = false;
if((b = !b) == true) {
Console.WriteLine("Hi");
}
本编译意愿打印Hi
。
这同样适用于你的剃须刀声明,或同时格式化字符串:
Console.WriteLine($"b was {b}, now b is {b = !b}");
// b was true, now b is false
关于你提到的例子,这是不可能与一个ternary if
声明。
我们可以使用一条语句将变量设置为false,并将其设置为而不是 print active。
b ? (b = false) : "";
然后我们就可以嵌套另一个if
声明打印活跃。因为b
已经是false
我们需要否定b。 else
-路径中的空字符串将永远不会被达到,但需要满足编译器。
!(b = false) ? "active" : "never reached"
组合这些后,我们得到:
b ? (!(b = false) ? "active" : "") : "";
这只会发出active
的第一个项目。
var b = true;
Console.WriteLine(b ? (!(b = false) ? "active" : "") : ""); // prints "active"
Console.WriteLine(b ? (!(b = false) ? "active" : "") : ""); // prints ""
Console.WriteLine(b ? (!(b = false) ? "active" : "") : ""); // prints ""
你是指像否定运算符还是?你可以总是有'if(b = DoSomething())' –
而不是像否定运算符 – Serge
你是什么意思的“改变它”内联? – Amy