diff --git a/DEVGUIDE.md b/DEVGUIDE.md
index 8983169580..8e043b4dd5 100644
--- a/DEVGUIDE.md
+++ b/DEVGUIDE.md
@@ -147,6 +147,12 @@ If you are on a Mac, you can run this command from the root of the repository:
sh build.sh -c Release
```
+Or if you are on Linux:
+
+```shell
+./build.sh -c Release
+```
+
## Updating baselines in tests
Some tests use "baseline" (.bsl) files. There is sometimes a way to update these baselines en-masse in your local build,
diff --git a/README.md b/README.md
index f9f4bbcd7b..be1f103e9e 100644
--- a/README.md
+++ b/README.md
@@ -59,7 +59,21 @@ Even if you find a single-character typo, we're happy to take the change! Althou
## Per-build NuGet packages
-Per-build [versions](https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-tools&view=versions&package=FSharp.Compiler.Service&protocolType=NuGet) of our NuGet packages are available via this URL: `https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json`
+### 7.0.40x series
+
+[FSharp.Compiler.Service 43.7.400-preview](https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet7/NuGet/FSharp.Compiler.Service/versions/)
+
+```xml
+
+```
+
+### 8.0.10x series
+
+[FSharp.Compiler.Service 43.8.100-preview](https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet8/NuGet/FSharp.Compiler.Service/versions/)
+
+```xml
+
+```
## Branches
diff --git a/src/Compiler/Checking/CheckDeclarations.fs b/src/Compiler/Checking/CheckDeclarations.fs
index d4c15029ff..a37c39a7d4 100644
--- a/src/Compiler/Checking/CheckDeclarations.fs
+++ b/src/Compiler/Checking/CheckDeclarations.fs
@@ -2556,8 +2556,9 @@ module EstablishTypeDefinitionCores =
| SynModuleDecl.Types (typeSpecs, _) ->
for SynTypeDefn(typeInfo=SynComponentInfo(typeParams=synTypars; longId=ids); typeRepr=trepr) in typeSpecs do
if TyparsAllHaveMeasureDeclEarlyCheck cenv env synTypars then
- match trepr with
- | SynTypeDefnRepr.ObjectModel(kind=SynTypeDefnKind.Augmentation _) -> ()
+ match trepr, ids with
+ | SynTypeDefnRepr.ObjectModel(kind=SynTypeDefnKind.Augmentation _), _ -> ()
+ | _, [] -> ()
| _ -> yield (List.last ids).idText
| _ -> () ]
|> set
@@ -4831,7 +4832,8 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem
let defn = TMDefRec(true, [], [decl], binds |> List.map ModuleOrNamespaceBinding.Binding, m)
return ([defn], [], []), env, env
- | SynModuleDecl.Types (typeDefs, m) ->
+ | SynModuleDecl.Types (typeDefs, m) ->
+ let typeDefs = typeDefs |> List.filter (function (SynTypeDefn(typeInfo = SynComponentInfo(longId = []))) -> false | _ -> true)
let scopem = unionRanges m scopem
let mutRecDefns = typeDefs |> List.map MutRecShape.Tycon
let mutRecDefnsChecked, envAfter = TcDeclarations.TcMutRecDefinitions cenv env parent typeNames tpenv m scopem None mutRecDefns false
diff --git a/src/Compiler/FSComp.txt b/src/Compiler/FSComp.txt
index 6aa808c45a..6bcea07ddc 100644
--- a/src/Compiler/FSComp.txt
+++ b/src/Compiler/FSComp.txt
@@ -421,7 +421,7 @@ parsAttributesMustComeBeforeVal,"Attributes should be placed before 'val'"
555,parsGetAndOrSetRequired,"'get' and/or 'set' required"
556,parsTypeAnnotationsOnGetSet,"Type annotations on property getters and setters must be given after the 'get()' or 'set(v)', e.g. 'with get() : string = ...'"
557,parsGetterMustHaveAtLeastOneArgument,"A getter property is expected to be a function, e.g. 'get() = ...' or 'get(index) = ...'"
-558,parsMultipleAccessibilitiesForGetSet,"Multiple accessibilities given for property getter or setter"
+558,parsMultipleAccessibilitiesForGetSet,"When the visibility for a property is specified, setting the visibility of the set or get method is not allowed."
559,parsSetSyntax,"Property setters must be defined using 'set value = ', 'set idx value = ' or 'set (idx1,...,idxN) value = ... '"
560,parsInterfacesHaveSameVisibilityAsEnclosingType,"Interfaces always have the same visibility as the enclosing type"
561,parsAccessibilityModsIllegalForAbstract,"Accessibility modifiers are not allowed on this member. Abstract slots always have the same visibility as the enclosing type."
@@ -1519,7 +1519,7 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl
3302,packageManagementRequiresVFive,"The 'package management' feature requires language version 5.0 or above"
3303,fromEndSlicingRequiresVFive,"The 'from the end slicing' feature requires language version 'preview'."
3304,poundiNotSupportedByRegisteredDependencyManagers,"#i is not supported by the registered PackageManagers"
-3343,tcRequireMergeSourcesOrBindN,"The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '%s' method or appropriate 'MergeSource' and 'Bind' methods"
+3343,tcRequireMergeSourcesOrBindN,"The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '%s' method or appropriate 'MergeSources' and 'Bind' methods"
3344,tcAndBangNotSupported,"This feature is not supported in this version of F#. You may need to add /langversion:preview to use this feature."
3345,tcInvalidUseBangBindingNoAndBangs,"use! may not be combined with and!"
3350,chkFeatureNotLanguageSupported,"Feature '%s' is not available in F# %s. Please use language version %s or greater."
diff --git a/src/Compiler/SyntaxTree/LexFilter.fs b/src/Compiler/SyntaxTree/LexFilter.fs
index 1c5b635498..09bc37e0c5 100644
--- a/src/Compiler/SyntaxTree/LexFilter.fs
+++ b/src/Compiler/SyntaxTree/LexFilter.fs
@@ -751,6 +751,9 @@ type LexFilterImpl (
| CtxtSeqBlock(FirstInSeqBlock, _, _), (CtxtDo _ as limitCtxt) :: CtxtSeqBlock _ :: (CtxtTypeDefns _ | CtxtModuleBody _) :: _ ->
PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1)
+ | CtxtSeqBlock(FirstInSeqBlock, _, _), CtxtWithAsAugment _ :: (CtxtTypeDefns _ as limitCtxt) :: _ ->
+ PositionWithColumn(limitCtxt.StartPos, limitCtxt.StartCol + 1)
+
| _, CtxtSeqBlock _ :: rest when not strict -> undentationLimit strict rest
| _, CtxtParen _ :: rest when not strict -> undentationLimit strict rest
@@ -2308,7 +2311,7 @@ type LexFilterImpl (
if debug then dprintf "WITH\n"
if debug then dprintf "WITH --> NO MATCH, pushing CtxtWithAsAugment (type augmentation), stack = %A" stack
pushCtxt tokenTup (CtxtWithAsAugment tokenStartPos)
- pushCtxtSeqBlock tokenTup AddBlockEnd
+ tryPushCtxtSeqBlock tokenTup AddBlockEnd
returnToken tokenLexbufState token
| FUNCTION, _ ->
diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fs b/src/Compiler/SyntaxTree/SyntaxTrivia.fs
index d5c459b33f..497c666f1d 100644
--- a/src/Compiler/SyntaxTree/SyntaxTrivia.fs
+++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fs
@@ -135,6 +135,13 @@ type SynTypeDefnLeadingKeyword =
| StaticType of staticRange: range * typeRange: range
| Synthetic
+ member this.Range =
+ match this with
+ | SynTypeDefnLeadingKeyword.Type range
+ | SynTypeDefnLeadingKeyword.And range -> range
+ | SynTypeDefnLeadingKeyword.StaticType (staticRange, typeRange) -> Range.unionRanges staticRange typeRange
+ | SynTypeDefnLeadingKeyword.Synthetic -> failwith "Getting range from synthetic keyword"
+
[]
type SynTypeDefnTrivia =
{
diff --git a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi
index 1f2d001cfd..fc28dc889b 100644
--- a/src/Compiler/SyntaxTree/SyntaxTrivia.fsi
+++ b/src/Compiler/SyntaxTree/SyntaxTrivia.fsi
@@ -219,11 +219,17 @@ type SynPatListConsTrivia =
[]
type SynTypeDefnLeadingKeyword =
| Type of range
+
| And of range
- // Can happen in SynMemberDefn.NestedType or SynMemberSig.NestedType
+
+ /// Can happen in SynMemberDefn.NestedType or SynMemberSig.NestedType
| StaticType of staticRange: range * typeRange: range
+
+ /// Produced during type checking, should not be used in actual parsed trees.
| Synthetic
+ member Range: range
+
/// Represents additional information for SynTypeDefn
[]
type SynTypeDefnTrivia =
diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy
index 0509f867c7..da62e142c2 100644
--- a/src/Compiler/pars.fsy
+++ b/src/Compiler/pars.fsy
@@ -527,6 +527,11 @@ moduleIntro:
let mModule = rhs parseState 1
mModule, $4, [], $3, $2 }
+ | moduleKeyword opt_attributes opt_access opt_rec recover
+ { if not (isNil $2) then
+ parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.AttributesToRightOfModuleKeyword (rhs parseState 4)
+ let mModule = rhs parseState 1
+ mModule, $4, [], $3, $2 }
/* The start of a namespace declaration */
namespaceIntro:
@@ -534,6 +539,10 @@ namespaceIntro:
{ let mNamespace = rhs parseState 1
mNamespace, $2, $3.LongIdent, grabXmlDoc(parseState, [], 1) }
+ | NAMESPACE opt_rec recover
+ { let mNamespace = rhs parseState 1
+ mNamespace, $2, [], grabXmlDoc(parseState, [], 1) }
+
/* The contents of a signature file */
fileNamespaceSpecs:
@@ -1138,8 +1147,8 @@ fileModuleImpl:
| moduleDefnsOrExprPossiblyEmptyOrBlock
{ let m = (rhs parseState 1)
(fun (mNamespaceOpt, isRec, path, xml) ->
- match path with
- | [] -> ParsedImplFileFragment.AnonModule($1, m)
+ match path, mNamespaceOpt with
+ | [], None -> ParsedImplFileFragment.AnonModule($1, m)
| _ ->
let lastDeclRange = List.tryLast $1 |> Option.map (fun decl -> decl.Range) |> Option.defaultValue (rhs parseState 1)
let m = mkRange lastDeclRange.FileName (lhs parseState).Start lastDeclRange.End
@@ -1540,7 +1549,8 @@ typeNameInfo:
| opt_attributes tyconNameAndTyparDecls opt_typeConstraints
{ let typars, lid, fixity, vis = $2
let xmlDoc = grabXmlDoc(parseState, $1, 1)
- SynComponentInfo ($1, typars, $3, lid, xmlDoc, fixity, vis, rangeOfLid lid) }
+ let m = match lid with [] -> rhs parseState 2 | _ -> rangeOfLid lid
+ SynComponentInfo ($1, typars, $3, lid, xmlDoc, fixity, vis, m) }
/* Part of a set of type definitions */
tyconDefnList:
@@ -1604,7 +1614,8 @@ tyconDefn:
let mEquals = rhs parseState 7
// Gets the XML doc comments prior to the implicit constructor
let xmlDoc = grabXmlDoc(parseState, $2, 2)
- let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, $2, spats, Option.map snd az, xmlDoc, rangeOfLid lid, { AsKeyword = Option.map fst az })
+ let m = match lid with [] -> rhs parseState 1 | _ -> rangeOfLid lid
+ let memberCtorPattern = SynMemberDefn.ImplicitCtor(vis, $2, spats, Option.map snd az, xmlDoc, m, { AsKeyword = Option.map fst az })
let tcDefRepr =
match tcDefRepr with
| SynTypeDefnRepr.ObjectModel (k, cspec, m) -> SynTypeDefnRepr.ObjectModel(k, memberCtorPattern :: cspec, m)
@@ -2317,6 +2328,9 @@ tyconNameAndTyparDecls:
| opt_access path postfixTyparDecls
{ Some $3, $2.LongIdent, true, $1 }
+ | opt_access recover
+ { None, [], false, $1 }
+
prefixTyparDecls:
| typar
{ SynTyparDecls.SinglePrefix(SynTyparDecl([], $1), rhs parseState 1) }
diff --git a/src/Compiler/xlf/FSComp.txt.cs.xlf b/src/Compiler/xlf/FSComp.txt.cs.xlf
index b0eb54ce4c..0f19339511 100644
--- a/src/Compiler/xlf/FSComp.txt.cs.xlf
+++ b/src/Compiler/xlf/FSComp.txt.cs.xlf
@@ -1153,8 +1153,8 @@
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- Konstrukt let! ... and! ... se dá použít jen v případě, že tvůrce výpočetních výrazů definuje buď metodu {0}, nebo vhodné metody MergeSource a Bind.
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ Konstrukt let! ... and! ... se dá použít jen v případě, že tvůrce výpočetních výrazů definuje buď metodu {0}, nebo vhodné metody MergeSource a Bind.
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- Zadali jste víc dostupností pro metodu getter nebo setter vlastnosti.
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ Zadali jste víc dostupností pro metodu getter nebo setter vlastnosti.
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- Das Konstrukt "let! ... and! ..." kann nur verwendet werden, wenn der Berechnungsausdrucks-Generator entweder eine {0}-Methode oder geeignete MergeSource- und Bind-Methoden definiert.
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ Das Konstrukt "let! ... and! ..." kann nur verwendet werden, wenn der Berechnungsausdrucks-Generator entweder eine {0}-Methode oder geeignete MergeSource- und Bind-Methoden definiert.
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- Für den Getter oder Setter der Eigenschaft wurden mehrere Zugriffsebenen angegeben.
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ Für den Getter oder Setter der Eigenschaft wurden mehrere Zugriffsebenen angegeben.
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- La construcción "let! ... and! ..." solo se puede usar si el generador de expresiones de cálculo define un método "{0}" o bien los métodos "MergeSource" y "Bind" adecuados.
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ La construcción "let! ... and! ..." solo se puede usar si el generador de expresiones de cálculo define un método "{0}" o bien los métodos "MergeSource" y "Bind" adecuados.
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- Se proporcionaron varias accesibilidades para un captador o establecedor de propiedad.
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ Se proporcionaron varias accesibilidades para un captador o establecedor de propiedad.
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- La construction 'let! ... and! ...' peut uniquement être utilisée si le générateur d'expressions de calcul définit une méthode '{0}' ou les méthodes 'MergeSource' et 'Bind' appropriées
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ La construction 'let! ... and! ...' peut uniquement être utilisée si le générateur d'expressions de calcul définit une méthode '{0}' ou les méthodes 'MergeSource' et 'Bind' appropriées
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- Plusieurs accessibilités fournies pour la méthode getter ou setter de la propriété
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ Plusieurs accessibilités fournies pour la méthode getter ou setter de la propriété
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- È possibile usare il costrutto 'let! ... and! ...' solo se il generatore di espressioni di calcolo definisce un metodo '{0}' o metodi 'MergeSource' e 'Bind' appropriati
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ È possibile usare il costrutto 'let! ... and! ...' solo se il generatore di espressioni di calcolo definisce un metodo '{0}' o metodi 'MergeSource' e 'Bind' appropriati
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- Sono state assegnate più accessibilità per il getter o il setter della proprietà
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ Sono state assegnate più accessibilità per il getter o il setter della proprietà
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- 'let! ... and! ...' コンストラクトは、コンピュテーション式ビルダーが '{0}' メソッドまたは適切な 'MergeSource' および 'Bind' メソッドのいずれかを定義している場合にのみ使用できます
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ 'let! ... and! ...' コンストラクトは、コンピュテーション式ビルダーが '{0}' メソッドまたは適切な 'MergeSource' および 'Bind' メソッドのいずれかを定義している場合にのみ使用できます
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- プロパティのゲッターまたはセッターに指定されたアクセシビリティが複数あります
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ プロパティのゲッターまたはセッターに指定されたアクセシビリティが複数あります
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- 'let! ... and! ...' 구문은 계산 식 작성기에서 '{0}' 메서드 또는 적절한 'MergeSource' 및 'Bind' 메서드를 정의한 경우에만 사용할 수 있습니다.
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ 'let! ... and! ...' 구문은 계산 식 작성기에서 '{0}' 메서드 또는 적절한 'MergeSource' 및 'Bind' 메서드를 정의한 경우에만 사용할 수 있습니다.
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- 속성 getter 또는 setter에 대해 여러 액세스 가능성이 지정되었습니다.
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ 속성 getter 또는 setter에 대해 여러 액세스 가능성이 지정되었습니다.
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- Konstrukcji „let! ... and! ...” można użyć tylko wtedy, gdy konstruktor wyrażeń obliczeniowych definiuje metodę „{0}” lub odpowiednie metody „MergeSource” i „Bind”
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ Konstrukcji „let! ... and! ...” można użyć tylko wtedy, gdy konstruktor wyrażeń obliczeniowych definiuje metodę „{0}” lub odpowiednie metody „MergeSource” i „Bind”
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- Podano wiele dostępności dla metody ustawiającej lub metody pobierającej właściwość
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ Podano wiele dostępności dla metody ustawiającej lub metody pobierającej właściwość
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- O constructo 'let! ... and! ...' só pode ser usado se o construtor de expressões de computação definir um método '{0}' ou um método 'MergeSource' ou 'Bind' apropriado
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ O constructo 'let! ... and! ...' só pode ser usado se o construtor de expressões de computação definir um método '{0}' ou um método 'MergeSource' ou 'Bind' apropriado
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- Acessibilidades múltiplas fornecidas para getter ou setter de propriedade
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ Acessibilidades múltiplas fornecidas para getter ou setter de propriedade
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- Конструкцию "let! ... and! ..." можно использовать только в том случае, если построитель выражений с вычислениями определяет либо метод "{0}", либо соответствующие методы "MergeSource" и "Bind"
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ Конструкцию "let! ... and! ..." можно использовать только в том случае, если построитель выражений с вычислениями определяет либо метод "{0}", либо соответствующие методы "MergeSource" и "Bind"
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- Задано несколько модификаторов доступности для метода получения или задания свойства
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ Задано несколько модификаторов доступности для метода получения или задания свойства
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- 'let! ... and! ...' yapısı, yalnızca hesaplama ifadesi oluşturucu bir '{0}' metodunu ya da uygun 'MergeSource' ve 'Bind' metotlarını tanımlarsa kullanılabilir
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ 'let! ... and! ...' yapısı, yalnızca hesaplama ifadesi oluşturucu bir '{0}' metodunu ya da uygun 'MergeSource' ve 'Bind' metotlarını tanımlarsa kullanılabilir
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- Özellik alıcı veya ayarlayıcı için birden çok erişilebilirlik verildi
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ Özellik alıcı veya ayarlayıcı için birden çok erişilebilirlik verildi
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- 仅当计算表达式生成器定义了 "{0}" 方法或适当的 "MergeSource" 和 "Bind" 方法时,才可以使用 "let! ... and! ..." 构造
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ 仅当计算表达式生成器定义了 "{0}" 方法或适当的 "MergeSource" 和 "Bind" 方法时,才可以使用 "let! ... and! ..." 构造
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- 为属性 Getter 或 Setter 给定了多个可访问性
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ 为属性 Getter 或 Setter 给定了多个可访问性
- The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSource' and 'Bind' methods
- 只有在計算運算式產生器定義 '{0}' 方法或正確的 'MergeSource' 和 'Bind' 方法時,才可使用 'let! ... and! ...' 建構
+ The 'let! ... and! ...' construct may only be used if the computation expression builder defines either a '{0}' method or appropriate 'MergeSources' and 'Bind' methods
+ 只有在計算運算式產生器定義 '{0}' 方法或正確的 'MergeSource' 和 'Bind' 方法時,才可使用 'let! ... and! ...' 建構
@@ -3283,8 +3283,8 @@
- Multiple accessibilities given for property getter or setter
- 為屬性 getter 或 setter 指定了多個存取範圍
+ When the visibility for a property is specified, setting the visibility of the set or get method is not allowed.
+ 為屬性 getter 或 setter 指定了多個存取範圍