首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >F#实际上在IL中将私有成员编译为内部成员。虫子?

F#实际上在IL中将私有成员编译为内部成员。虫子?
EN

Stack Overflow用户
提问于 2013-09-10 19:17:45
回答 1查看 615关注 0票数 16

我总是假设F#中的访问控制关键字(publicprivateinternal)的工作方式与C#中的相同。确实来自MSDN文档Access Control (F#)

  • public表示所有人都可以访问该实体。callers.
  • internal表示只能从同一个assembly.
  • private访问该实体。

这似乎与我的假设非常一致,也是在SO上提供了关于这个主题的多个答案。

但是,当我使用Reflector查看编译后的代码时,我发现所有那些声明为私有的成员实际上都被编译为内部(程序集可见性),这与文档不符。

为了避免任何疑问,我创建了一个小测试来确认这一点。

F#代码:

代码语言:javascript
复制
// Make internals visible to other assemblies
[<assembly:InternalsVisibleTo("MyCSharpAssembly")>]


// OK. Expect: "internal static class PrivateModule" in C#
module private PrivateModule =

    // FAIL. Expect: "private static void privateStaticMethod()" in C#
    let private privateStaticMethod() = ignore()

// OK. Expect: "internal class InternalClass" in C#
type private InternalClass() =

    // FAIL. Expect: "private int privateInstanceField" in C#
    let privateInstanceField = 0

    // FAIL. Expect: "private static int privateStaticField" in C#
    static let privateStaticField = 0

    // FAIL. Expect: "private int privateInstanceMethod()" in C#
    let privateInstanceMethod() = privateInstanceField

    // FAIL. Expect: "private in PrivateInstanceMember()" in C#
    member private this.PrivateInstanceMember() = privateInstanceField

    // OK. Expect: "internal int InternalInstanceMember" in C#
    member internal this.InternalInstanceMember() = privateStaticField

我把一些C#代码放在一起,以确保我不是在胡思乱想。

C#测试代码,一切都会编译完成。

代码语言:javascript
复制
public class TestVisibility
{
    // This is a demo to verify that the members are indeed
    // internal (assembly) and can be accessed from C# if the
    // F# assembly is compiled with [<assembly:InternalsVisibleTo("C# assembly")>]
    public void Run()
    {
        // All of these compile.
        PrivateModule.privateStaticMethod();

        InternalClass x = new InternalClass();

        int a = InternalClass.privateStaticField;
        var b = x.InternalInstanceMember();
        var c = x.PrivateInstanceMember();
        var d = x.privateInstanceField;
        var f = x.privateInstanceMethod();
    }
}

我使用的是VS2012,目标是.NET 4.0,所有设置都是默认设置。尝试了Debug和release两种模式,结果相同。

Question:根据设计,实际的预期行为是什么?这是个bug吗?还是我做错了什么?

Suggestion:如果这是有意为之的行为,那么在文档中明确提到这一点可能是一个好主意?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-10 20:29:05

从命令行界面:所有非公共实体的F# 3.0 specification编译形式是内部__。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18717501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档