我正面临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
访问在其他地方定义的值类型为私有(只能使用泛型)的任何公共字段?