为什么匿名类型在C#中具有内部可见性?

为什么匿名类型在C#中具有内部可见性?,c#,anonymous-types,C#,Anonymous Types,这是因为匿名类型为公共类型时可能发生的安全问题吗?我就是不明白 这就是我希望该语言支持的代码类型 大会1 public class Renderer { public void RenderHtmlInput(dynamic inputModel) { var html = string.format("<input type='text' width='{0}' height='{1}'>", inputModel.width, inputModel

这是因为匿名类型为公共类型时可能发生的安全问题吗?我就是不明白

这就是我希望该语言支持的代码类型

大会1

public class Renderer
{
    public void RenderHtmlInput(dynamic inputModel)
    {
        var html = string.format("<input type='text' width='{0}' height='{1}'>", inputModel.width, inputModel.height);
        ...
    }
}

因为你应该在同一个图书馆里使用它们。 在接口或类边界上公开匿名类型是不合适的

如果要这样做,请使用动态类型


编辑:匿名类型的名称也会自动生成,因此从库中公开它们意味着它们可能与另一个库中的匿名类型冲突。

使用谷歌,这是一个经典问题。它们是匿名的,意味着它们没有您可以引用的名称。您将如何在外部引用匿名类型?@Oded<代码>动态。。。阅读@Oded我不认为这是一个破坏性的改变。事实上,
动态
也可以遵守可访问性规则,特别是当它对使用reflection@linkerro为什么“在接口或类边界上公开匿名类型是不合适的”?@linkerro为什么我要在同一个库中使用它们?我不认为这会是一个安全问题。匿名类型只是具有一组属性的类,这些属性只有getter。这怎么可能有害呢?这不是安全问题,而是“可用性”问题。如果您想声明一个接受匿名类的变量,您不能这样做,除非它正好位于生成该类的代码旁边。否则编译器无法推断变量的类型。另外,您不能取消匿名类型的绑定。我不想声明匿名类型的变量,但最好在一个程序集中有一个接受动态参数的方法,并且能够从另一个程序集中向该方法传递匿名类型。
public class Consumer
{
    public void Run()
    {
        var renderer = new Renderer();

        renderer.RenderInput(new { width = "12px", height = "20px" });
    }
}