Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Dit document bevat inconsistenties tussen Roslyn en de C#-standaard waar ze bekend zijn, ingedeeld op standaardsectie.
Conversions
Impliciete enumconversies van nul
Vanaf §10.2.4:
Met een impliciete opsommingsconversie kan een constant_expression (§12,25) met een geheel getal en de waarde nul worden geconverteerd naar een enum_type en naar een nullable_value_type waarvan het onderliggende type een enum_type is.
Roslyn voert impliciete opsommingsconversies uit constante expressies met typen floaten doubledecimal ook:
enum SampleEnum
{
Zero = 0,
One = 1
}
class EnumConversionTest
{
const float ConstFloat = 0f;
const double ConstDouble = 0d;
const decimal ConstDecimal = 0m;
static void PermittedConversions()
{
SampleEnum floatToEnum = ConstFloat;
SampleEnum doubleToEnum = ConstDouble;
SampleEnum decimalToEnum = ConstDecimal;
}
}
Conversies zijn (correct) niet toegestaan vanuit constante expressies met een type bool, andere opsommingen of verwijzingstypen.
Opzoeken van leden
Vanaf §12.5.1:
- Ten slotte wordt het resultaat van de zoekactie bepaald nadat verborgen leden zijn verwijderd:
- Als de set bestaat uit één lid dat geen methode is, is dit lid het resultaat van de opzoekactie.
- Als de set alleen methoden bevat, is deze groep methoden het resultaat van de opzoekactie.
- Anders is de zoekactie dubbelzinnig en treedt er een bindingstijdfout op.
Roslyn implementeert in plaats daarvan een voorkeur voor methoden ten opzichte van niet-methodesymbolen:
var x = I.M; // binds to I1.M (method)
x();
System.Action y = I.M; // binds to I1.M (method)
interface I1 { static void M() { } }
interface I2 { static int M => 0; }
interface I3 { static int M = 0; }
interface I : I1, I2, I3 { }
I i = null;
var x = i.M; // binds to I1.M (method)
x();
System.Action y = i.M; // binds to I1.M (method)
interface I1 { void M() { } }
interface I2 { int M => 0; }
interface I : I1, I2 { }
Veronderstellingen over bekende typen/leden
De compiler is vrij om aannames te doen over de vorm en het gedrag van bekende type-elementen.
Mogelijk wordt er niet gecontroleerd op onverwachte beperkingen, Obsolete kenmerken of UnmanagedCallersOnly kenmerken.
Het kan enkele optimalisaties uitvoeren op basis van de verwachting dat de typen/leden zich goed gedragen.
Opmerking: de compiler moet bestand blijven tegen ontbrekende bekende typen/leden.
Gedeeltelijke methoden in een interface
Gedeeltelijke interfacemethoden zijn impliciet niet-virtueel, in tegenstelling tot niet-gedeeltelijke interfacemethoden en andere soorten gedeeltelijke interfaceleden, zie een gerelateerde wijziging die fouten veroorzaken en LDM 2025-04-07.
Roslyn breaking changes