I am facing a really weird behavior of ValueTuple<T1,T2>
passed from another assembly, accessed using dynamic
. This code under specific circumstances throws RuntimeBinderException
at the last line:
TupleTest(out var t);
(dynamic i1, dynamic i2) = t;
dynamic a = i1.Item1;
The message is:
'System.ValueType' does not contain a definition for 'Item1'
TupleTest
function is defined in another assembly like this:
static void TupleTest(out ValueTuple<dynamic, dynamic> result) {
result = default;
result.Item1 = (new Priv(), new Priv());
result.Item2 = (new Priv(), new Priv());
}
Where empty class Priv { }
has no visibility modifiers.
However, if I add public class Priv
, the issue goes away.
I understand, that binder could have had problems accessing instance members of Priv
, but in this case I am not getting to that yet! All I am trying to do is to access field Item1
of ValueTuple
.
Interestingly, if Priv
implements some public interface IFoo
, then replacing result.Item1 = (new Priv(), new Priv());
with result.Item1 = ((IFoo)new Priv(), (IFoo)new Priv())
allows dynamic a = i1.Item1
to succeed.
Does that mean, that I can't use dynamic
at all to access any public fields, whose value type is private (can only be possible with generics), defined elsewhere?