C# 私有内部类上的动态失败

C# 私有内部类上的动态失败,c#,dynamic,inner-classes,C#,Dynamic,Inner Classes,当我运行以下代码时,我得到RuntimeBinderException:“object”不包含“SetIt”的定义。 public interface IInput { } public interface IThing<in TInput> { void SetIt(TInput value); } public class ThingMaker { private class Thing<TInput> : IThing<TInput>

当我运行以下代码时,我得到
RuntimeBinderException:“object”不包含“SetIt”的定义。

public interface IInput { }

public interface IThing<in TInput>
{
    void SetIt(TInput value);
}

public class ThingMaker
{
    private class Thing<TInput> : IThing<TInput>
        where TInput : IInput
    {
        public void SetIt(TInput value){}
    }

    private class Input : IInput {}

    public IThing<IInput> GetThing()
    {
        return new Thing<IInput>();
    }

    public IInput GetInput()
    {
        return new Input();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var thingMaker = new ThingMaker();

        var input = thingMaker.GetInput();
        dynamic thing= thingMaker.GetThing();

        thing.SetIt(input);
    }
}
公共接口IInput{}
公共接口
{
无效设置(TInput值);
}
公共物品制造者
{
私人类的东西:我喜欢
TInput的位置:I输入
{
public void SetIt(TInput值){}
}
私有类输入:IInput{}
公共信息
{
返回新事物();
}
公共IInput GetInput()
{
返回新输入();
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var thingMaker=新thingMaker();
var input=thingMaker.GetInput();
动态事物=thingMaker.GetThing();
设置它(输入);
}
}
如果我把
东西
切换到
变量
就可以了。很明显,
东西
设置它
。为什么我使用dynamic时会失败?作为
var
工作的任何东西,当它是
动态的时候,难道不应该也工作吗


我认为这与
东西
是一个私有的内部类有关,因为当我公开它时,它就起作用了。

下面是一个简单的问题示例:

class A
{
    class B
    {
        public void M() { }
    }

    public static object GetB() { return new B(); }
}

class Program
{
    static void Main(string[] args)
    {
        dynamic o = A.GetB();

        o.M();
    }
}
泛型和接口只是一种干扰

问题是类型
B
(或者在您的情况下,
Thing
)是一个私有类,因此在调用站点上,无法解析为该实际类型。回想一下,
dynamic
只是一个
对象
变量,但编译被推迟到运行时。它并不打算让您在运行时做一些本来无法做的事情,而“本来无法做”是根据调用站点的可访问类型来判断的(在本例中,它是
对象

就运行时绑定器而言,类型只是
object
(因此错误消息告诉您
object
不包含所需的成员)

当然,从理论上讲,
dynamic
可以以不同的方式实现,并且可以对有效类型进行更深入的搜索。它可以将对象视为将成员绑定到对象的目的(即实现的接口,而不仅仅是对象的实际类型)。但这并不是它的实现方式,而且这样做的成本要高得多(无论是在原始设计和实现方面,还是在使用
动态
的代码的运行时成本方面)

相关阅读(可重复):