【问题标题】:RuntimeBinderException when accessing ValueTuple item via dynamic通过动态访问 ValueTuple 项时出现 RuntimeBinderException
【发布时间】:2018-12-11 05:50:39
【问题描述】:

我正面临从另一个程序集传递的ValueTuple<T1,T2> 的一个非常奇怪的行为,使用dynamic 访问。这段代码具体情况下最后一行抛出RuntimeBinderException

TupleTest(out var t);
(dynamic i1, dynamic i2) = t;
dynamic a = i1.Item1;

消息是:

'System.ValueType' does not contain a definition for 'Item1'

TupleTest 函数在另一个程序集中定义,如下所示:

static void TupleTest(out ValueTuple<dynamic, dynamic> result) {
    result = default;

    result.Item1 = (new Priv(), new Priv());
    result.Item2 = (new Priv(), new Priv());
}

空的class Priv { } 没有可见性修饰符。

但是,如果我添加 public class Priv,问题就会消失。

我知道,绑定器可能在访问 Priv 的实例成员时遇到问题,但在这种情况下,我还没有解决这个问题!我要做的就是访问ValueTuple 的字段Item1

有趣的是,如果Priv 实现了一些公共接口IFoo,那么将result.Item1 = (new Priv(), new Priv()); 替换为result.Item1 = ((IFoo)new Priv(), (IFoo)new Priv()) 允许dynamic a = i1.Item1 成功。

这是否意味着,我根本不能使用 dynamic 访问任何公共字段,其值类型是私有的(只能使用泛型),在别处定义?

【问题讨论】:

  • 在我的机器上工作。在sharplab.io
  • @PauloMorgado Priv 必须在不同的程序集中声明才能重现。

标签: c# dynamic valuetuple


【解决方案1】:

发生这种情况是因为尝试访问它的代码无法访问Priv

dynamic 中类型的可访问性必须遵守编译器规则。

不过,错误消息并不是很有帮助。

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2023-03-07
    相关资源
    最近更新 更多