首页 > 解决方案 > 通过动态访问 ValueTuple 项时出现 RuntimeBinderException

问题描述

我正面临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());
}

emptyclass Priv { }没有可见性修饰符。

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

我知道,那个 binder 可能在访问 的实例成员时遇到问题Priv,但在这种情况下,我还没有做到这一点!我要做的就是访问Item1.ValueTuple

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

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

标签: c#dynamicvaluetuple

解决方案


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

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

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


推荐阅读