我正在尝试执行下一个代码,但是在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();
}
答案 0 :(得分:6)
错误消息告诉您“方法组和方法组之间没有隐式转换”。在古老的编译器错误传统中,这在任何已知的自然语言中几乎没有任何意义。但是,凭经验,我们了解到它告诉我们需要转换为其他内容,并且我们还从经验中知道,除非引用的类型为Action
或Func
。这是一个粗略而经验性的经验法则,当我遇到这些问题时,我发现它可以帮助我很快地过上自己的生活。充分而正确地理解为什么会这样是有价值的。请参阅下面的一些见解。
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)的强制转换时,突然会有可用参数,即空参数列表。现在,我们有证据表明开发人员希望为组中的哪一种方法选择:没有参数的方法。