通过动态访问ValueTuple项时出现RuntimeBinderException

时间:2018-11-28 23:51:22

标签: c# dynamic valuetuple

我正面临着从另一个程序集传递来的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的实例成员时遇到问题,但是在这种情况下,我还没有做到这一点!我要做的就是访问Item1的字段ValueTuple

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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