Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是ExpressionTrees的bug吗#4._C#_.net_Expression Trees - Fatal编程技术网

C# 这是ExpressionTrees的bug吗#4.

C# 这是ExpressionTrees的bug吗#4.,c#,.net,expression-trees,C#,.net,Expression Trees,这不是“接近真实”的情况,但它表明,如果表达式API在源类型中找到合适的运算符,它不会在转换的目标类型中查找运算符 sealed class Foo { public static explicit operator Bar(Foo foo) { return null; } } sealed class Bar { public static implicit operator Bar(Foo foo) { return null; } } class Program { pu

这不是“接近真实”的情况,但它表明,如果表达式API在源类型中找到合适的运算符,它不会在转换的目标类型中查找运算符

sealed class Foo
{
  public static explicit operator Bar(Foo foo) { return null; }
}

sealed class Bar
{
  public static implicit operator Bar(Foo foo) { return null; }
}

class Program
{
  public static void Blah(Bar bar) { }

  private static void Main()
  {
    Expression<Func<Foo, Bar>> expr1 = x => x;

    // fine, used implicit operator from Bar

    var param = Expression.Parameter(typeof(Foo), "x");

    var expr2 = Expression.Lambda<Func<Foo, Bar>>(
      Expression.Convert(param, typeof(Bar)),
      param);

    // fine, but used explicit operator from Foo!
  }
}
密封类Foo
{
公共静态显式运算符Bar(Foo-Foo){return null;}
}
密封级钢筋
{
公共静态隐式运算符Bar(Foo-Foo){return null;}
}
班级计划
{
公共静态无效Blah(Bar){}
私有静态void Main()
{
表达式expr1=x=>x;
//很好,使用了条形图中的隐式运算符
var param=表达式参数(typeof(Foo),“x”);
var expr2=Expression.Lambda(
Expression.Convert(param,typeof(Bar)),
参数);
//很好,但是使用了来自Foo的显式运算符!
}
}

另外,如果模拟两种类型中用户定义的运算符之间的歧义,C#编译器根本不会编译转换,但表达式API将使用来自转换源类型的运算符。

不,这不是表达式树错误。如果您不能为表达式树库提供足够的信息来执行您想要的操作,那么您只能接受它的默认值。没有任何理由认为这些违约行为需要遵循C#的规则;表达式树库不是C#编译器

sealed class Foo
{
  public static explicit operator Bar(Foo foo) { return null; }
}

sealed class Bar
{
  public static implicit operator Bar(Foo foo) { return null; }
}

class Program
{
  public static void Blah(Bar bar) { }

  private static void Main()
  {
    Expression<Func<Foo, Bar>> expr1 = x => x;

    // fine, used implicit operator from Bar

    var param = Expression.Parameter(typeof(Foo), "x");

    var expr2 = Expression.Lambda<Func<Foo, Bar>>(
      Expression.Convert(param, typeof(Bar)),
      param);

    // fine, but used explicit operator from Foo!
  }
}