Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Runtime.InteropServices;
- class Base { }
- class Derived : Base
- {
- // 1個や2個だと「たまたま0詰め」な領域を指すかもしれないので無駄にたくさんフィールド並べる
- public long A { get; }
- public long B { get; }
- public long C { get; }
- public long D { get; }
- public (long, long, long, long) T => (A, B, C, D);
- }
- [StructLayout(LayoutKind.Explicit)]
- struct Union
- {
- [FieldOffset(0)]
- public Base Base;
- [FieldOffset(0)]
- public Derived Derived;
- }
- class Program
- {
- // 本来やってはいけないダウンキャスト
- static Derived AsDerived(Base b)
- {
- var u = new Union();
- u.Base = b;
- return u.Derived;
- }
- static void Main()
- {
- var b = new Base();
- // やってはいけないダウンキャストを強行
- var d = AsDerived(b);
- // Derived な変数に Base が入ってる
- Console.WriteLine(d.GetType());
- // Derived にしかないはずのメンバーを読み出し
- // (0, 0, 140708363800272, 0) みたいな身に覚えのない値が取れる
- // 読めるだけならいいけど書き換えもできるんでさらにまずい(GC クラッシュ & セキュリティ ホール)
- Console.WriteLine(d.T);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement