gpt4 book ai didi

C#:隐式运算符和扩展方法

转载 作者:可可西里 更新时间:2023-11-01 08:23:47 26 4
gpt4 key购买 nike

我正在尝试创建一个 PredicateBuilder<T>包装 Expression<Func<T, bool>> 的类并提供了一些方法来轻松构建具有各种 And 的表达式和 Or方法。我觉得如果我能用这个会很酷 PredicateBuilder<T>作为Expression<Func<T, bool>>直接,并认为这可以通过 implicit operator 来完成方法的事情。

该类的简化版本如下所示:

class PredicateBuilder<T>
{
public Expression<Func<T, bool>> Predicate { get; protected set; }

public PredicateBuilder(bool initialPredicate)
{
Predicate = initialPredicate
? (Expression<Func<T, bool>>) (x => true)
: x => false;
}

public static implicit operator Expression<Func<T, bool>>(
PredicateBuilder<T> expressionBuilder)
{
return expressionBuilder.Predicate;
}
}

然后,作为测试,我在静态类中有这个扩展方法:

public static void PrintExpression<T>(this Expression<Func<T, bool>> expression)
{
Console.WriteLine(expression);
}

在我的脑海中,我应该能够做到这些:

var p = new PredicateBuilder<int>(true);

p.PrintExpression();
PredicateExtensions.PrintExpression(p);

但是它们都不起作用。对于第一个,没有找到扩展方法。第二,它说

The type arguments for method 'ExtravagantExpressions.PredicateHelper.PrintExpression(System.Linq.Expressions.Expression>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

所以我尝试了以下方法,效果很好:

PredicateExtensions.PrintExpression<int>(p);

此外,这当然有效:

((Expression<Func<int, bool>>) p).PrintExpression();

但是是的...为什么其他人不起作用?我是不是误解了什么 implicit operator有用吗?

最佳答案

这不是特定于扩展方法。 C# 不会将对象隐式转换为另一种类型,除非有关于目标类型的线索。假设如下:

class A {
public static implicit operator B(A obj) { ... }
public static implicit operator C(A obj) { ... }
}

class B {
public void Foo() { ... }
}

class C {
public void Foo() { ... }
}

您希望在以下语句中调用哪个方法?

new A().Foo(); // B.Foo? C.Foo? 

关于C#:隐式运算符和扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/685156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com