我正在尝试使用Rolyn的一些私有代码来实现codefix
Partial Public Class SynatxEditorFixAllProvider
Inherits FixAllProvider
Public Overrides Async Function GetFixAsync(ByVal fixAllContext As FixAllContext) As Task(Of CodeAction)
Dim documentsAndDiagnosticsToFixMap As ImmutableDictionary(Of Document, ImmutableArray(Of Diagnostic)) = Await fixAllContext.GetDocumentDiagnosticsToFixAsync().ConfigureAwait(False)
Return Await GetFixAsync1(documentsAndDiagnosticsToFixMap, fixAllContext, fixAllContext.CancellationToken).ConfigureAwait(False)
End Function
Async Function GetFixAsync1(ByVal documentsAndDiagnosticsToFixMap As ImmutableDictionary(Of Document, ImmutableArray(Of Diagnostic)), ByVal _FixAllContext As FixAllContext, ByVal cancellationToken As CancellationToken) As Task(Of CodeAction)
' Process all documents in parallel.
Dim updatedDocumentTasks As IEnumerable(Of Task(Of Document)) = documentsAndDiagnosticsToFixMap.Select(Function(kvp) FixDocumentAsync(kvp.Key, kvp.Value, cancellationToken))
Await Task.WhenAll(updatedDocumentTasks).ConfigureAwait(False)
Dim currentSolution As Solution = _FixAllContext.Solution
For Each Task As Task(Of Document) In updatedDocumentTasks
' 'await' the tasks so that if any completed in a canceled manner then we'll
' throw the right exception here. Calling .Result on the tasks might end up
' with AggregateExceptions being thrown instead.
Dim updatedDocument As Document = Await Task.ConfigureAwait(False)
currentSolution = currentSolution.WithDocumentSyntaxRoot(updatedDocument.Id, Await updatedDocument.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(False))
Next Task
Dim title As String = GetFixAllTitle(_FixAllContext)
Return New SolutionChangeAction(title, Function(underscore) Task.FromResult(currentSolution))
End Function
只有这段代码我得到一个错误,它想要下面的代码
Partial Public MustInherit Class SynatxEditorFixAllProvider
Protected MustOverride Function FixAllAsync(ByVal document As Document, ByVal diagnostics As ImmutableArray(Of Diagnostic), ByVal editor As SyntaxEditor, ByVal cancellationToken As CancellationToken) As Task
End Class
但是,如果我在上面添加代码,则会出现错误,
“New不能用于声明为MustInherit的类”
Public Shared ReadOnly Property Instance() As FixAllProvider = New SynatxEditorFixAllProvider()
答案 0 :(得分:0)
MustInherit 是抽象类的VB .NET语法。
这些类无法直接实例化。但是,从它们派生的类可以实例化为新对象。
例如,Animal可能是 MustInherit 的一个很好的例子。 Dog将是一个可能来自Animal的类,并且没有标记为 MustInherit 。
开发人员可以创建Dog的新实例,但不能创建Animal的实例。
MustOverride 是派生类必须为其提供实现的方法。在Animal示例中,我们假设它有一个名为 MakeNoise 的方法。你永远不可能在动物一级实施这种方法,因为你不知道一般动物会产生什么样的噪音,但是在派生的狗类中,你可以。
在您的情况下,如果您想从SynatxEditorFixAllProvider派生,请确保您提供了派生类的 FixAllAsync 方法的实现。
答案 1 :(得分:0)
MustInherit表示您的Class
是抽象的,无法实例化。这些类只能间接实例化,即你Inherit
Class
来自它们实现未实现的方法并实例化该子Class
。
MustOverride表示您的方法未实现,应该在第一个非抽象后代类中实现(最新点)。
New是实例化的关键字。如果你说
New SolutionChangeAction(title, Function(underscore) Task.FromResult(currentSolution))
然后您打算创建(实例化)Object
SolutionChangeAction
的{{1}}。从你的问题来看,似乎Class
也是抽象的,所以你需要从它继承一个非抽象的SolutionChangeAction
并实例化它。
答案 2 :(得分:0)
谢谢大家,我需要改变
MustInherit Class SynatxEditorFixAllProvider
要
MustInherit Class SynatxEditorFixAllProviderBase
然后将课程改为
Partial Public Class SynatxEditorFixAllProvider
Inherits SynatxEditorFixAllProviderBase
我用作示例的C#代码用于将抽象类与实现分开,而在VB中不起作用。