C# Language?:三元运算符
示例
返回两个值之一,具体取决于布尔表达式的值。
语法:
condition ? expression_if_true : expression_if_false;
例:
string name = "Frank"; Console.WriteLine(name == "Frank" ? "The name is Frank" : "The name is not Frank");
三元运算符是右关联的,它允许使用复合三元表达式。这可以通过在父三元方程的正确或错误位置添加其他三元方程来完成。应该注意确保可读性,但这在某些情况下可能是有用的速记。
在这个例子中,一个化合物三元操作计算一个clamp函数,如果它是该范围内,则返回当前值min,如果值是低于该范围,或max数值,如果它是上述的范围内。
light.intensity = Clamp(light.intensity, minLight, maxLight); public static float Clamp(float val, float min, float max) { return (val < min) ? min : (val > max) ? max : val; }
三元运算符也可以嵌套,例如:
a ? b ? "a is true, b is true" : "a is true, b is false" : "a is false" //这是从左到右评估的,可以通过括号更容易地看到: a ? (b ? x : y) : z // Where the result is x if a && b, y if a && !b, and z if !a
编写复合三元语句时,通常使用括号或缩进来提高可读性。
expression_if_true和expression_if_false的类型必须相同,或者必须存在从一种隐式转换为另一种的隐式转换。
condition ? 3 : "Not three"; //无法编译,因为`int`和`string`缺少隐式转换。 condition ? 3.ToString() : "Not three"; //可以,因为两个可能的输出都是字符串。 condition ? 3 : 3.5; //可以,因为存在从int到double的隐式转换。三元运算符将返回“double”。 condition ? 3.5 : 3; //可以,因为存在从int到double的隐式转换。三元运算符将返回“double”。
类型和转换要求也适用于您自己的类。
public class Car {} public class SportsCar : Car {} public class SUV : Car {} condition ? new SportsCar() : new Car(); //可以,因为存在从“SportsCar”到“Car”的隐式转换。三元运算符将返回类型为Car的引用。 condition ? new Car() : new SportsCar(); //可以,因为存在从“SportsCar”到“Car”的隐式转换。三元运算符将返回类型为Car的引用。 condition ? new SportsCar() : new SUV(); //无法编译,因为没有从“SportsCar”到SUV或从“SUV”到“SportsCar”的隐式转换。编译器不够聪明,无法意识到它们都隐式转换为Car。 condition ? new SportsCar() as Car : new SUV() as Car; //可以,因为两个表达式的计算结果均为“Car”类型的引用。三元运算符将返回类型为Car的引用。