WebHU - Programozási kérdések és válaszok

A dinamikus objektum C# metódusnak való átadása megváltoztatja a visszatérési típust

Létrehoztam egy osztályt, amely örökli a DynamicObject értéket, és szeretném olyan statikus metódus létrehozásához, amely előre meghatározott tulajdonságokkal (a Dictionary-ban tárolva) tud új példányokat létrehozni.

public class CustomDynamic : DynamicObject
{
    protected Dictionary<string, object> InnerDictionary;

    public static T Create<T>(Dictionary<string, object> dictionary) where T : CustomDynamic , new()
    {
        return new T
        {
            InnerDictionary = dictionary
        };
    }
}

Használat:

dynamic d = new Dictionary<string, object>();

var realPlayer = CustomDynamic.Create<Player>(d as Dictionary<string, object>);
var dynaPlayer = CustomDynamic.Create<Player>(d);

realPlayer // Player type according to VS2013
dynaPlayer // dynamic type according to VS2013

Mivel csak egy metódusaláírás létezik, a dinamikus átadás miért ad vissza dinamikus objektumot? Vagy valójában csak a Visual Studio 2013 kezd összezavarodni?

17.09.2014

Válaszok:


1

Ennek az az oka, hogy szinte bármely dinamikus értéket tartalmazó művelet dinamikusan oldódik meg a végrehajtás során. Nincs kivétel azokra az esetekre, amikor valójában csak egy metódus van jelen a fordítási időben; a nyelv egyszerűbb így. (Bizonyos hívások esetén a fordító nem elegendő felbontást hajt végre fordítási időben annak biztosítására, hogy legyen legalább egy megfelelő számú paraméterrel rendelkező metódus – ezt a 7.5. szakasz C#5 specifikációja határozza meg. 4, de ez nem befolyásolja a tényleges visszatérési típust.)

A C# 5 specifikáció 7.6.5 szakaszából:

Egy meghívási kifejezés dinamikusan kötődik, ha az alábbiak közül legalább egy teljesül:

  • Az elsődleges kifejezés fordítási időtípusa dynamic.
  • Az opcionális argumentumot legalább egy argumentumának fordítási ideje dynamic, az elsődleges kifejezés pedig nem rendelkezik delegált típussal.

Ebben az esetben a fordító az invocation-expression-t dynamic típusú értékként osztályozza. [...]

Van néhány olyan művelet, amely dinamikus értékeket tartalmaz, amelyeknek még mindig nem dinamikus általános típusa van. Például:

  • d is Foo mindig bool
  • d as Foo mindig Foo
  • A new Foo(d) mindig Foo, még akkor is, ha a használandó konstruktor a végrehajtás során kerül meghatározásra

De minden metódushívást dynamic visszatérési típusnak kell tekinteni.

17.09.2014

2

Így működik a dinamika. A MSDN-ről

A túlterhelés-feloldás futási időben történik a fordítási idő helyett, ha a metódushívásban egy vagy több argumentum dinamikus típusú, vagy ha a metódushívás vevője dinamikus típusú.

Azt gondolhatja, hogy nincs további túlterhelése a módszerhez, de előfordulhat. A fordító nem hajtja végre ezt az ellenőrzést a fordításkor, ezért a dynaPlayer típusát látja dinamikusnak a Player helyett.

17.09.2014
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..