我遇到了奇怪的行为:使用三元运算符创建谓词时,不能使用简写的条件逻辑运算符。发生编译器错误CS0173。也许代码会更好地解释它的含义。
public class Account {
public bool IsDeleted { get; set; }
public bool IsActive { get; set; }
}
// Так можно,
Predicate<Account> predicate = x => x.IsActive && !x.IsDeleted;
// а так нет,
Predicate<Account> predicate = onlyDeleted
? x => x.IsDeleted
: x => x.IsActive && !x.IsDeleted;
// Ошибка CS0173
// Не удается определить тип условного выражения,
// так как неявного преобразования между
// "лямбда-выражение" и "лямбда-выражение" не существует.
// но так тоже можно.
Predicate<Account> predicate = onlyDeleted
? x => x.IsDeleted
: new Predicate<Account>(x => x.IsActive && !x.IsDeleted);
使用 Visual Studio 2019 版本 16.4.2。
对为什么会发生这种情况感兴趣?也许还有其他选择?
现在(在 C# 9 中)它可以工作了。
因为 lambdas 没有唯一的类型
可以解释以及编译器如何
Func<A,B>以及如何Expression<Func<A,B>>不能总是推断出所需的类型本身。(这就是你不能写的原因var a = x => x.IsDeleted)在简单的情况下——通常的赋值——这是可行的,但在三元运算符的情况下,会尝试确定两个分支的类型。由于两个分支中都没有显式类型,因此编译器无法推断出三元运算符将返回的泛型类型,因此什么也不做。
如果至少为其中一个分支指定了类型,则一切都开始工作。