C# 这是ExpressionTrees的bug吗#4.
这不是“接近真实”的情况,但它表明,如果表达式API在源类型中找到合适的运算符,它不会在转换的目标类型中查找运算符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
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!
}
}