三元(条件)运算符和if语句返回Action之间的区别

paq*_*mez 3 c# if-statement ternary-operator

请考虑以下不编译的代码:

class WhyNot
{
    private Action _doSomething;
    public bool ThisOrThat;

    public WhyNot()
    {
        _doSomething = ThisOrThat ?  DoThis : DoThat;   
    }
    private void DoThis()
    {}
    private void DoThat()
    {}
}
Run Code Online (Sandbox Code Playgroud)

我知道这不起作用,因为方法本身并不具有类型,而代理则这样做,因此必须进行显式强制转换.

_doSomething = ThisOrThat ? (Action)DoThis : (Action)DoThat;    
Run Code Online (Sandbox Code Playgroud)

我不遵循的是为什么标准if语句成功地在三元运算符失败的情况下转换它们?

if (ThisOrThat)
    _doSomething = DoThis;
else
    _doSomething = DoThat;
Run Code Online (Sandbox Code Playgroud)

为什么运营商之间存在差异?

Hab*_*bib 5

为什么在条件运算符中需要显式强制转换

_doSomething = ThisOrThat ?  DoThis : DoThat; 
Run Code Online (Sandbox Code Playgroud)

这个答案从乔恩斯基特:

作为表达.那是什么类型的?方法组应转换为什么委托类型?编译器无法知道.如果您转换其中一个操作数,编译器可以检查是否可以转换另一个操作数

对于你的问题:

为什么在if声明中允许它

您正在进行一个简单的分配,其中左侧是Action,右侧是方法组.存在隐式转换

请参阅赋值运算符(=)C#

赋值运算符(=)将其右侧操作数的值存储在由其左侧操作数表示的存储位置,属性或索引器中,并将该值作为结果返回.操作数必须是相同的类型(或者右操作数必须可以隐式转换为左操作数的类型)