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

标签 c# operator-overloading extension-methods

我正在尝试创建一个 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/

相关文章:

c# - 为什么我的 Specflow [AfterTestRun] Hook 被调用两次

c++ - operator << 对象 vector 的重载

c# - 有没有办法从 app.config 文件加载 Linq to SQL 的现有连接字符串?

c# - session 选项.SecureSocketLayer

c++ - 与三值比较函数相比,仅使用小于运算符进行排序

c++ - 模板类的标准流输出

c# - "this"用作方法参数的前缀时是什么意思?

c# - 泛型类的扩展方法

c# - 使用 System.CodeDom 生成扩展方法

c# - 在远程计算机上安装 msi (ManagementException "Not found")