当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#:隐式运算符和扩展方法》经验,为你挑选了1个好方法。

我想创建一个PredicateBuilder它包装的类Expression>,并提供一些方法来轻松地建立了各种的表达AndOr方法.我认为这将是冷静,如果我可以用这PredicateBuilder一个是Expression>直接,认为这可以由具有进行implicit operator方法的事情.

这个类的精简版看起来像这样:

class PredicateBuilder
{
    public Expression> Predicate { get; protected set; }

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

    public static implicit operator Expression>(
        PredicateBuilder expressionBuilder)
    {
        return expressionBuilder.Predicate;
    }
}

然后,就像测试一样,我在静态类中有这个扩展方法:

public static void PrintExpression(this Expression> expression)
{
    Console.WriteLine(expression);
}

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

var p = new PredicateBuilder(true);

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

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

无法从用法中推断出方法'ExtravagantExpressions.PredicateHelper.PrintExpression(System.Linq.Expressions.Expression>)'的类型参数.尝试显式指定类型参数.

所以我尝试了以下工作:

PredicateExtensions.PrintExpression(p);

此外,这当然有效:

((Expression>) p).PrintExpression();

但是,为什么其他人不工作呢?我误解了这个东西是如何implicit operator工作的吗?



1> Mehrdad Afsh..:

这不是扩展方法特有的.除非有关于目标类型的线索,否则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? 


我希望"Foo()不明确:B.Foo()或C.Foo()"
推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有