C# 在If/else vs?中分配代表:

C# 在If/else vs?中分配代表:,c#,C#,为什么要编译此代码: Func<BeExp, IEnumerable<BeExp>> collectFunc; if (lhs.Kind == BExpKind.BESum) { collectFunc = CollectSumTerms; } else { collectFunc = CollectProdTerms; } Func-collectFunc; 如果(lhs.Kind==BExpKind.BESum) { collectFunc=Coll

为什么要编译此代码:

Func<BeExp, IEnumerable<BeExp>> collectFunc;
if (lhs.Kind == BExpKind.BESum)
{
    collectFunc = CollectSumTerms;
}
else
{
    collectFunc = CollectProdTerms;
}
Func-collectFunc;
如果(lhs.Kind==BExpKind.BESum)
{
collectFunc=CollectSumTerms;
}
其他的
{
collectFunc=CollectProdTerms;
}
但这不是吗

Func<BeExp, IEnumerable<BeExp>> collectFunc = lhs.Kind == BExpKind.BESum ? CollectSumTerms : CollectProdTerms;
Func collectFunc=lhs.Kind==BExpKind.BESum?CollectSumTerms:CollectProdTerms;
错误:

错误CS0173无法确定条件表达式的类型,因为“方法组”和“方法组”之间没有隐式转换


您需要为组中至少一个方法向提供准确的签名

var collectFunc = lhs.Kind == BExpKind.BESum ? (Func<BeExp, IEnumerable<BeExp>>)CollectSumTerms : CollectProdTerms;
var collectFunc=lhs.Kind==BExpKind.BESum?(Func)CollectSumTerms:CollectProdTerms;

我认为这是因为当您使用运算符“:”时,左侧(当子句为true时)和右侧(当它为false时)必须具有相同的类型。