Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#从C#继承类访问受保护字段_C#_F# - Fatal编程技术网

F#从C#继承类访问受保护字段

F#从C#继承类访问受保护字段,c#,f#,C#,F#,我有一门C#课程,看起来是这样的: class A { protected SomeClass Field; } class B: A {} public class C : B { public int SomeMethod() { SomeClass stub = this.Field; FSharpFunc<Unit, int> d = new d@11(stub); return d.Invoke(n

我有一门C#课程,看起来是这样的:

class A {
    protected SomeClass Field;
}

class B: A {}
public class C : B
{
    public int SomeMethod()
    {
        SomeClass stub = this.Field;
        FSharpFunc<Unit, int> d = new d@11(stub);
        return d.Invoke(null);
    }
}
以及F#中的以下代码:

我想在其中访问受保护的字段
字段
。我知道我可以通过简单的键入
base.something
()从B类访问受保护的字段,但是当我键入
base.Field
从A类访问受保护的字段时,我得到一个错误,即
结构或类字段不能从该代码位置访问,因为
字段
在A类(?).
我的问题是,是否有可能访问它?

我找到了解决问题的方法。 这样的代码是不正确的:

type C() =
    inherit B()

    member this.SomeMethod() =
        let d() = base.Field.SomeMagic(someParameter) //this.Field also fails
        d()
但这样的代码可以正常工作:

type C() =
    inherit B()

    member this.SomeMethod() =
        let stub = this.Field
        let d() = stub.SomeMagic(someParameter)
        d()

我找到了解决问题的办法。 这样的代码是不正确的:

type C() =
    inherit B()

    member this.SomeMethod() =
        let d() = base.Field.SomeMagic(someParameter) //this.Field also fails
        d()
但这样的代码可以正常工作:

type C() =
    inherit B()

    member this.SomeMethod() =
        let stub = this.Field
        let d() = stub.SomeMagic(someParameter)
        d()

存根变通方法之所以有效,是因为您试图访问let绑定函数
d
主体中的受保护字段。这些函数被移动到上下文之外,它们在上下文中定义并编译成
FSharpFunc
type的子类型。也就是说,在编译的F#代码中可以得到类似的结果(简化图):


并且在class
C
之外不再发生受保护的访问

存根变通方法之所以有效,是因为您试图访问let绑定函数体中的受保护字段
d
。这些函数被移动到上下文之外,它们在上下文中定义并编译成
FSharpFunc
type的子类型。也就是说,在编译的F#代码中可以得到类似的结果(简化图):


并且在class
C
之外不再发生受保护的访问

可能的副本。看起来使用问题的第一部分可以解决问题。@Kote不,如果我在B类而不是A类中声明了字段,则解决方案是正确的。实际上,我根本无法重现您的问题。如果我使用您显示的确切代码(但使用有效的方法体),我得到的
“base”值只能用于直接调用被重写成员的基本实现。如果我正确地编写了代码,如
this.Field
而不是
base.Field
,那么它可以正常工作。可能会重复。看起来使用问题的第一部分可以解决问题。@Kote不,如果我在B类而不是A类中声明了字段,则解决方案是正确的。实际上,我根本无法重现您的问题。如果我使用您显示的确切代码(但使用有效的方法体),我得到的
“base”值只能用于直接调用被重写成员的基本实现。如果我正确地编写了代码,如
this.Field
而不是
base.Field
,它工作得很好。编辑以使方法的主体明确(并将downvote更改为upvote)。编辑以使方法的主体明确(并将downvote更改为upvote)。@MNie:当然,在我被你的例子骗了之后,我觉得有义务给你一个@曼妮:当然,我被你的例子骗了之后,觉得有义务给我一个