C# 如何测试表达式是否短路

C# 如何测试表达式是否短路,c#,unit-testing,lambda,expression-trees,C#,Unit Testing,Lambda,Expression Trees,我有一个具有以下签名的扩展方法: public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second) { ... } 但是我在b的整个语句体下得到了一个巨大的红色曲线,表示“带有语句体的lambda表达式不能转换为表达式树”。所以有选择

我有一个具有以下签名的扩展方法:

public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
{
    ...
}

但是我在
b
的整个语句体下得到了一个巨大的红色曲线,表示“带有语句体的lambda表达式不能转换为表达式树”。所以有选择吗?或者这是一个不可能编写的测试?

简单的建议:使用引用类型而不是值类型,并在不希望遵循的路径中取消引用它。传入null,并查看它是否引发异常:)

然后:

[测试]
public void和_谓词reshortcircuited()
{
表达式a=x=>false;
表达式b=x=>NonoidFail(x);
var foo=new[]{1,2,3,4,5,6,7}
.Where(a.And(b.Compile())
.ToArray();
}

这是同样的原则,但它会给你一个更好的例外:)

你在这里混淆了一些真假。我想我现在就成功了这只是一个关于错误的简短解释。单行lambda表达式或表达式lambda(“a”case)与表达式树之间存在隐式转换,但多行lambda表达式或语句lambda(“b”case)与表达式树之间不存在隐式转换。有关更多信息,请参见如何提出这些内容…?:p--谢谢D
    [Test]
    public void And_PredicatesAreShortCircuited()
    {
        var predicateNotUsed = true;
        Expression<Func<int, bool>> a = x => false;
        Expression<Func<int, bool>> b = x =>
            {
                predicateNotUsed = false;
                return true;
            };

        var foo = new[] { 1, 2, 3, 4, 5, 6, 7 }
            .Where(a.And(b).Compile())
            .ToArray();

        Assert.That(predicateNotUsed);
    }
[Test]
public void And_PredicatesAreShortCircuited()
{
    Expression<Func<string, bool>> a = x => false;
    Expression<Func<string, bool>> b = x => x.Length > 10;

    var foo = new[] { null, null }
        .Where(a.And(b).Compile())
        .ToArray();
}
public T NonVoidFail(T x)
{
    Assert.Fail("I shouldn't be called");
    return x; // Will never happen
}
[Test]
public void And_PredicatesAreShortCircuited()
{
    Expression<Func<int, bool>> a = x => false;
    Expression<Func<int, bool>> b = x => NonVoidFail(x);

    var foo = new[] { 1, 2, 3, 4, 5, 6, 7 }
        .Where(a.And(b).Compile())
        .ToArray();
}