2014-06-12 21 views
15

Ich habe den Nullfortpflanzungsoperator in C# 6 untersucht und versucht, ihn mit den Variablen des Typs dynamic arbeiten zu lassen, aber ohne Erfolg. Betrachten Sie den folgenden Code, es kompiliert, aber CLR löst zur Laufzeit AccessViolationException, wenn die Null-Propagation auf dynamisches Objekt angewendet wird.Nullfortpflanzungsoperator und dynamische Variable

class SomeType 
{ 
    public object SomeProperty { get; set; } 

    static void Main() 
    { 
     var obj = new SomeType() { SomeProperty = "ABCD" }; 

     var p1 = ((dynamic)obj).SomeProperty; //OK, p1 is set to "ABCD" 
     var p2 = ((dynamic)obj)?.SomeProperty; //AccessViolationException 

     Console.ReadLine(); 
    } 
} 

Zuerst dachte ich, dass dies ein Fehler sein könnte, aber ich dachte, über struct s dann. Normalerweise können Sie den Operator ?. nicht auf eine Werttypvariable anwenden (weil er nicht null sein kann). Aber Sie können es in dynamic umwandeln und dann den Operator anwenden. Also änderte ich SomeType zu struct und bekam die selbe Ausnahme.

Die Frage ist, ist es von Entwurf, dass Null-Propagation für dynamische Variablen wird immer Ausnahme auslösen, weil das zugrunde liegende Objekt ein Werttyp sein kann?

Die AccessViolationException ist sowieso ziemlich hässlich, erhalten Sie die gleiche, wenn Sie den Code ausführen?

+0

Nur ein Stich in die Dunkelheit: Was passiert, wenn Sie 'SomeType'' public' anstelle von 'internal' machen? –

+0

@ChrisSinclair Ausgabe ist das gleiche – nosalan

+3

Wenn Sie 'PEVerify.exe' gegen Ihre Exe ausführen, meldet es irgendwelche Fehler? – latkin

Antwort

3

AccessViolationException ist fast immer entweder ein Compilerfehler oder ein falsch ausgeführter PInvoke-Aufruf.