首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法确定条件表达式的类型(Func)

无法确定条件表达式的类型(Func)
EN

Stack Overflow用户
提问于 2011-06-10 23:11:38
回答 3查看 5.9K关注 0票数 22

在将方法分配给Func-type时,我得到了编译错误Type of conditional expression cannot be determined because there is no implicit conversion between 'method group' and 'method group'

这只发生在? :运算符上。代码:

代码语言:javascript
复制
public class Test
{
    public static string One(int value)
    {
        value += 1;
        return value.ToString();
    }
    public static string Two(int value)
    {
        value += 2;
        return value.ToString();
    }
    public void Testing(bool which)
    {
        // This works
        Func<int, string> actionWorks;
        if (which) actionWorks = One; else actionWorks = Two;

        // Compilation error on the part "One : Two"
        Func<int, string> action = which ? One : Two;
    }
}

我找到了关于协变和逆变的some information,但我看不出这如何适用于上面的情况。为什么这个不起作用?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-10 23:16:43

您需要显式提供至少一个方法组的签名。但是,在这样做之后,编译器将允许您将action声明为隐式类型的本地类型:

代码语言:javascript
复制
var action = which ? (Func<int, string>)One : Two;

发生这种情况的原因是,operator ?:的返回类型不是基于您试图将其赋值的类型推导出来的,而是基于这两个表达式的类型。如果类型相同或者它们之间存在隐式转换,则编译器会成功推导出返回类型;否则,编译器会报告没有转换。

票数 33
EN

Stack Overflow用户

发布于 2011-06-10 23:17:03

将函数直接赋值给委托时,如果该函数与签名匹配,则编译器会将该函数转换为所需的委托类型。

但是,当您使用?:运算符时,就编译器而言,您没有直接赋值给委托,因此它不知道使用哪种类型来表示1和2,因此它认为?:运算符中使用的两种类型不匹配。

唯一的解决方法是显式转换:

代码语言:javascript
复制
Func<int, string> action = which ? new Func<int, string>(One) : new Func<int, string>(Two);
票数 6
EN

Stack Overflow用户

发布于 2013-08-09 18:01:24

Jon的解决方案奏效

代码语言:javascript
复制
var action = which ? (Func<int, string>)One : Two;

另一种选择是自己创建一个新的匿名委托。这在语义上略有不同,但我认为这也是有用的。

代码语言:javascript
复制
Func<int, string> action = x => which ? One(x) : Two(x);

我觉得这个小女孩更优雅,虽然不是那么短..

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6308328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档