gpt4 book ai didi

c# - 私有(private)内部类上的动态失败

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

当我运行以下代码时,我得到 RuntimeBinderException: 'object' does not contain a definition for '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);
}
}

如果我切换 thingvar它工作正常。很明显,thingSetIt .当我使用动态时为什么会失败?不应该作为 var 工作的任何东西吗?在 dynamic 时也有效?

我认为这与Thing<TInput>有关成为私有(private)内部类,因为当我公开它时它会起作用。

最佳答案

这是您的问题的一个简单示例:

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();
}
}

泛型和接口(interface)只是一种干扰。

问题是类型 B (或者在您的情况下, Thing<IInput> )是一个私有(private)类,因此在调用站点,无法解析为该实际类型。回想一下 dynamic只是一个object变量,但编译已推迟到运行时。它的目的不是让你在运行时做你本来无法做的事情,并且“否则无法做”是根据调用站点的可访问类型来判断的(在这个案例,是 object )。

就运行时绑定(bind)器而言,类型很简单object (因此错误消息告诉您 object 不包含您想要的成员)。

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

相关阅读(可以重复):

Is this a bug in dynamic?
Is this a hole in dynamic binding in C# 4?

关于c# - 私有(private)内部类上的动态失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46417150/

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