C# 这是ExpressionTrees的bug吗#3.

C# 这是ExpressionTrees的bug吗#3.,c#,.net,expression-trees,C#,.net,Expression Trees,在搜索用户定义的运算符时,表达式类应该更精确 sealed class Foo { // just the private static method! private static int op_Implicit() { return 1; } public static implicit operator int(Foo foo) { return 2; } } public class Program { private static void Main() {

在搜索用户定义的运算符时,表达式类应该更精确

sealed class Foo
{
  // just the private static method!
  private static int op_Implicit() { return 1; }

  public static implicit operator int(Foo foo) { return 2; }
}

public class Program
{
  private static void Main()
  {
    var param = Expression.Parameter(typeof(Foo), "x");

    // IndexOutOfRangeException was unhandled!
    var lambda = Expression.Lambda<Func<Foo, int>>(
      Expression.Convert(param, typeof (int)), param);
  }
}
密封类Foo
{
//只是私有静态方法!
私有静态int op_Implicit(){return 1;}
公共静态隐式运算符int(Foo-Foo){return 2;}
}
公共课程
{
私有静态void Main()
{
var param=表达式参数(typeof(Foo),“x”);
//IndexAutoFrangeException未处理!
var lambda=表达式.lambda(
Expression.Convert(param,typeof(int)),param);
}
}
此外,还可以使用多个参数定义静态
op_Explicit
op_Implicit
方法,表达式类将此方法作为用户定义的运算符接受


p、 s.ExpressionTrees查找带有
BindingFlags的运算符。非公共的
标志,它允许在用户类型中搜索运算符,这对于System.Core.dll不直接可见,但它也允许表达式API查找“看起来像”用户定义运算符的私有方法。但C#规则不允许定义和使用非公共运算符!我认为表达式API的行为应该是相同的…

为什么您认为表达式树库应该遵循C#的规则,而不是VB?还是其他语言?或者没有其他语言?是什么证明了这个信念?谢谢你的回答,埃里克。这种情况下的表达式API行为根本没有文档记录(我在MSDN中没有找到任何有关的信息),同时表达式API更常用于代码生成任务。。。因此,让行为与最流行的.NET语言行为或API高度匹配将是一件好事。此外,上面的代码失败不是因为“我相信”,而是因为表达式API运算符搜索例程执行
method.GetParameters()[0].ParameterType
不保证返回的数组不是空的或非一元素数组。我同意文档可能更好。我也同意解引用异常可能是一个表达式树错误。我会将其传递给QA,但这不会在库的v4版本中得到修复。如果您认为文档不完善,请通过Microsoft Connect提交一个错误,或者使用MSDN online上的反馈功能来获取特定主题,并说明要添加到文档中的内容。如果要查找表达式树的详细文档,请查看。这里介绍了最先进的用例,而不是MSDN。此外,您还可以直接与DLR团队进行沟通。