gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:08:44 25 4
gpt4 key购买 nike

我正面临一个非常奇怪的行为 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 ,问题就消失了。

我知道, Binder 在访问 Priv 的实例成员时可能有问题,但在这种情况下,我还没有做到这一点!我要做的就是访问字段 Item1ValueTuple .

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

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

最佳答案

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

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

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

关于c# - 通过动态访问 ValueTuple 项时出现 RuntimeBinderException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53529856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com