为什么在C#中我们无法在三元运算符中评估方法?

时间:2019-05-06 18:29:09

标签: c#

我正在尝试执行下一个代码,但是在C#中不允许这样做。为什么? 在C ++中,它工作正常。

void A()
{
    Console.WriteLine("A");
}

void B()
{
    Console.WriteLine("B");
}

void C()
{
    //getRandomInt return digit from 0 to 99
    bool compareResult= getRandomInt(100) < 50;
    var result = compareResult ? A : B;
    result();
}

1 个答案:

答案 0 :(得分:6)

错误消息告诉您“方法组和方法组之间没有隐式转换”。在古老的编译器错误传统中,这在任何已知的自然语言中几乎没有任何意义。但是,凭经验,我们了解到它告诉我们需要转换为其他内容,并且我们还从经验中知道,除非引用的类型为ActionFunc。这是一个粗略而经验性的经验法则,当我遇到这些问题时,我发现它可以帮助我很快地过上自己的生活。充分而正确地理解为什么会这样是有价值的。请参阅下面的一些见解。

A和B是返回void的一元方法,因此我尝试了强制转换为Action。它编译了。

var result = compareResult ? (Action)A : B;

可估量的埃里克·利珀特(Eric Lippert)(请参阅下面他的全部评论)阐明:

  

...方法组在C#中没有类型;它们可以可转换为某些类型,但是它们没有类型

当我们说“方法”组时,我们的意思是“通过名称引用函数而不调用它”。考虑:

public void A() { }

public int A(int x) => 2 * x;

public void B() { }

A个以上。编译器也许可以通过采取看起来像B的代码(如果有的话)自行解决歧义,但事实并非如此,并且从经验来看,我有充分的理由为什么它不尝试这样做那个,埃里克(Eric)解决了:

  

简短的版本是:解决该问题需要付出太多的努力,而获得的收益却很少,而我们很可能会弄错它。稍长一点的版本是:我们认为在C#中,解析方法组的唯一方法是针对一组参数评估组中成员的适合性,或者在调用方法组时以表达式的形式,或将方法组转换为委托时的类型形式。此示例中没有可用的参数!

     

但是当您按照建议包括对(Action)的强制转换时,突然会有可用参数,即空参数列表。现在,我们有证据表明开发人员希望为组中的哪一种方法选择:没有参数的方法。