A: 95 byte
class A{public static int i=2;static void Main(string[]args){System.Console.Write(args[0]);}}//
Cobalah online!
B: 438 + 18 byte
class A{public static int i=0;}
class B{static void Main(string[]args){if(A.i<1){System.Console.Write(args[0]);return;}var a=@"class A{{public static int i=2;static void Main(string[]args){{System.Console.Write(args[0]);}}}}//class A{{public static int i=0;}}
class B{{static void Main(string[]args){{if(A.i<1){{System.Console.Write(args[0]);return;}}var a=@{0}{1}{0};System.Console.Write(a,'{0}',a);}}}}";System.Console.Write(a,'"',a);}}
Cobalah online!
A + B: 533 + 18 byte
class A{public static int i=2;static void Main(string[]args){System.Console.Write(args[0]);}}//class A{public static int i=0;}
class B{static void Main(string[]args){if(A.i<1){System.Console.Write(args[0]);return;}var a=@"class A{{public static int i=2;static void Main(string[]args){{System.Console.Write(args[0]);}}}}//class A{{public static int i=0;}}
class B{{static void Main(string[]args){{if(A.i<1){{System.Console.Write(args[0]);return;}}var a=@{0}{1}{0};System.Console.Write(a,'{0}',a);}}}}";System.Console.Write(a,'"',a);}}
Cobalah online!
A dan B menerima input sebagai argumen baris perintah. A + B mengabaikan input apa pun. 18 byte pada B dan A + B ditambahkan untuk /p:StartupObject=B
opsi yang dikirim ke MSBuild. Ini hanya benar-benar diperlukan pada A + B, tetapi sepertinya curang untuk tidak juga memilikinya di B. Dengan cara ini, bendera kompiler untuk A + B adalah bendera kompiler untuk A (tidak ada) ditambah bendera kompiler untuk B.
Penjelasan
Program A sangat mudah. Kelas A berisi variabel statis (tidak terpakai) i
diinisialisasi ke 2
, dan mencetak argumen pertamanya ketika dijalankan. Pada //
akhirnya adalah penting untuk kode A + B, tetapi tidak melakukan apa pun dalam A itu sendiri.
Program B aneh dalam isolasi, tetapi pada dasarnya sama. Itu menciptakan Kelas A yang berisi variabel statis i
diinisialisasi ke 0
, dan kemudian menjalankan metode Utama Kelas B, yang melakukan hal yang sama dengan Program A karena A.i
kurang dari 1, dan kembali sebelum hal-hal aneh. Baris baru tidak diperlukan di sini, tetapi penting untuk A + B.
Ketika digabungkan, //
dari Program A mengomentari deklarasi Kelas A dari Program B, tetapi karena baris baru, Kelas B baik-baik saja, yang memungkinkan A.i
untuk merujuk pada 2
nilai dari Program A sebagai gantinya. Bendera Kompiler membuat Program dijalankan B. Utama () karena A. Utama () juga ada. Hasilnya adalah bahwa Program A + B tidak menampilkan argumennya, tetapi sebaliknya menuju ke segmen B.Main (), yang pada dasarnya hanyalah standar C # quine .