- Czy istnieje sposób, aby zaznaczyć typ (lub nawet lepiej, interfejs), tak że nie ma przypadków może być przechowywany w polu (w sposób podobny do
TypedReference
iArgIterator
)? - W ten sam sposób, istnieje sposób, aby uniemożliwić przekazywanie instancji metodami anonimowymi i - Ogólnie - Aby naśladować zachowanie dwóch powyższych typów?
- Czy można to zrobić poprzez ILDasm lub bardziej ogólnie poprzez edycję IL? Ponieważ UnconstrainedMelody osiąga normalnie nieosiągalne wyniki przez binarną edycję skompilowanego zespołu, być może istnieje sposób na "zaznaczenie" pewnych typów (lub nawet lepszych, abstrakcyjnych lub interfejsów znacznikowych) za pomocą tego samego podejścia.
wątpię, to ustalony w kompilator ponieważ documentation for the error CS0610 stanach:Marka Typ jest non-Chowany
Istnieje kilka rodzajów, które nie mogą być stosowane jako pola lub właściwości. Te typy obejmują ...
Co według mnie sugeruje, że zestaw takich typów może zostać przedłużony - Ale mogę się mylić.
Szukałem trochę SO i gdy rozumiem, że programowo nie można wykonać throwing a compiler error, nie mogłem znaleźć żadnego źródła stwierdzającego, że pewne zachowania "specjalnych" typów nie mogły być replikowane.
Nawet jeśli pytanie jest w większości akademickie, może istnieć kilka sposobów na odpowiedź. Na przykład czasami przydatne może być upewnienie się, że czas życia danego obiektu jest ograniczony do bloku metody, który go tworzy.
EDYTOWANIE:RuntimeArgumentHandle
to kolejny (nie wymieniony) typ niezapisujący.
EDIT 2: Jeśli może być dowolnego użytku, wydaje się, że CLR traktuje te typy w inny sposób, jak również, jeśli nie tylko kompilator (wciąż zakładając, że typy są w żaden sposób nie różni się od innych). Poniższy program, na przykład, rzuci TypeLoadException
dotyczące TypedReference*
. Zaadaptowałem go, aby był krótszy, ale możesz go obejść, jak tylko chcesz. Zmiana typu wskaźnika na, powiedzmy, void*
nie spowoduje odrzucenia wyjątku.
using System;
unsafe static class Program
{
static TypedReference* _tr;
static void Main(string[] args)
{
_tr = (TypedReference*) IntPtr.Zero;
}
}
Nie byłbym wcale zaskoczony, gdyby * był * zakodowany na stałe. Tylko dlatego, że dokumentacja nie chce tego sparować, nie oznacza, że nie jest to robione w kompilatorze. –
Myślę, że to samo, ale muszę sprawdzić. –
[CS0611] (http://msdn.microsoft.com/en-US/library/bfca7x6z (v = vs.80) .aspx) jest pokrewnym błędem, chociaż prawdopodobnie rozwiązanie zastosowane do obu. – Mir