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();
}