首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在.NET中重写受F#保护的成员将产生一个公共成员

在.NET中重写受F#保护的成员将产生一个公共成员
EN

Stack Overflow用户
提问于 2022-02-14 00:20:27
回答 2查看 93关注 0票数 1

我遇到了一种看似“奇怪”的情况。复制:

  1. 创建F#库
  2. 添加组件类类型,继承ComponentBase
  3. 覆盖BuildRenderTree
代码语言:javascript
复制
//Comp1Base.fs
namespace ClassLibrary1

open Microsoft.AspNetCore.Components

type Comp1Base() = 
    inherit ComponentBase()

    override __.BuildRenderTree(builder) = base.BuildRenderTree(builder)
  1. 创建Blazor项目(C#)并引用F#项目
  2. 向此项目中添加剃须刀组件,并从F#基组件继承
代码语言:javascript
复制
//Comp1.razor
@inherits ClassLibrary1.Comp1Base

现在,Blazor项目没有编译:

代码语言:javascript
复制
Error   CS0507  'Comp1.BuildRenderTree(RenderTreeBuilder)': cannot change access modifiers when overriding 'public' inherited member 'Comp1Base.BuildRenderTree(RenderTreeBuilder)' BlazorApp1  C:\Temp\qwerty\BlazorApp1\Microsoft.NET.Sdk.Razor.SourceGenerators\Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator\Comp1_razor.g.cs   85  N/A

ILSpy显示F#中被重写的成员是公共的,而基本成员是受保护的:

有办法让它起作用吗?

EN

回答 2

Stack Overflow用户

发布于 2022-09-12 15:12:25

恐怕您不能在F#中直接这样做。您可以像这样用C#编写一个更友好的F包装器类型(为了说明起见,未经测试的代码):

代码语言:javascript
复制
public class FSharpFriendlyComponentBase: ComponentBase
{
    readonly Action<RenderTreeBuilder> _buildRenderTree

    public FSharpFriendlyComponentBase(Action<RenderTreeBuilder> buildRenderTree) =>
        _buildRenderTree = buildRenderTree;

    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        base.BuildRenderTree(builder);
        _buildRenderTree(builder);
    }
}

这样您就可以在F#中实现所需的行为:

代码语言:javascript
复制
let myComponentBase = 
    FSharpFriendlyComponentBase(fun builder -> 
        ... your behavior here)
票数 1
EN

Stack Overflow用户

发布于 2022-09-12 10:43:31

有点晚了,但我希望它能帮上忙:

In C# (我指的是C#)当将方法重写为 Microsoft Docs说。时,不能更改访问修饰符

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

https://stackoverflow.com/questions/71105988

复制
相关文章

相似问题

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