通过动态访问 ValueTuple 项时出现 RuntimeBinderException
RuntimeBinderException when accessing ValueTuple item via dynamic
我正面临从另一个程序集传递的 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
实现了一些 public 接口 IFoo
,那么用 result.Item1 = ((IFoo)new Priv(), (IFoo)new Priv())
替换 result.Item1 = (new Priv(), new Priv());
允许 dynamic a = i1.Item1
成功。
这是否意味着我根本无法使用 dynamic
来访问任何 public 字段,其值类型是私有的(只能使用泛型),在别处定义?
发生这种情况是因为尝试访问它的代码无法访问 Priv
。
dynamic
中类型的可访问性必须遵守编译器规则。
虽然错误消息不是很有帮助。
我正面临从另一个程序集传递的 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
实现了一些 public 接口 IFoo
,那么用 result.Item1 = ((IFoo)new Priv(), (IFoo)new Priv())
替换 result.Item1 = (new Priv(), new Priv());
允许 dynamic a = i1.Item1
成功。
这是否意味着我根本无法使用 dynamic
来访问任何 public 字段,其值类型是私有的(只能使用泛型),在别处定义?
发生这种情况是因为尝试访问它的代码无法访问 Priv
。
dynamic
中类型的可访问性必须遵守编译器规则。
虽然错误消息不是很有帮助。