powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Discriminated Unions в C#
7 сообщений из 7, страница 1 из 1
Discriminated Unions в C#
    #39845016
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как считаете, нужны ли DU в C#? Пользуетесь какими-то затычками типа OneOf и проч., испытывая нужду? Какие мысли? :)
...
Рейтинг: 0 / 0
Discriminated Unions в C#
    #39845031
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При нужде можно написать что требуется на F#, в котором DU есть от рождения, и подцепить эфшарповую сборку к проекту.
Запрос на поддержку DU в roslyn был еще 3 года тому назад , и чего-то они до сих пор по этому поводу не могут придти к консенсусу.
...
Рейтинг: 0 / 0
Discriminated Unions в C#
    #39845140
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныПри нужде можно написать что требуется на F#

Собственно в этом и вопрос, какая нужда может быть, что средств C# не хватает.


Сон Веры ПавловныЗапрос на поддержку DU в roslyn был еще 3 года тому назад , и чего-то они до сих пор по этому поводу не могут придти к консенсусу.

Это да, могли бы чего-нибудь и придумать. Тогда и дружить F# можно было бы более нативно.
...
Рейтинг: 0 / 0
Discriminated Unions в C#
    #39845323
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Собственно в этом и вопрос, какая нужда может быть, что средств C# не хватает.


Ну например парсер на F# проще написать. http://www.fssnip.net/lf/title/Simple-C-Parser
...
Рейтинг: 0 / 0
Discriminated Unions в C#
    #39845609
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВНу например парсер на F# проще написать. http://www.fssnip.net/lf/title/Simple-C-Parser

прикольно видеть на DU/PM классического визитёра. кстати, во что там DU разворачивается в те же анонимные классы поди? ))
...
Рейтинг: 0 / 0
Discriminated Unions в C#
    #39845659
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
Во вполне обычные классы.
Код: c#
1.
2.
3.
4.
type Shape =
    | Rectangle of width : float * length : float
    | Circle of radius : float
    | Prism of width : float * float * height : float



f#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
695.
696.
697.
698.
699.
700.
701.
702.
703.
704.
705.
706.
707.
708.
709.
710.
711.
712.
713.
714.
715.
716.
717.
718.
719.
720.
721.
722.
723.
724.
725.
726.
727.
728.
729.
730.
731.
732.
733.
734.
735.
736.
737.
738.
739.
740.
741.
742.
743.
744.
745.
746.
747.
748.
749.
750.
751.
752.
753.
754.
755.
756.
757.
758.
759.
760.
761.
762.
763.
764.
765.
766.
767.
768.
769.
770.
771.
772.
773.
774.
775.
776.
777.
778.
779.
780.
781.
782.
783.
784.
785.
786.
787.
788.
789.
790.
791.
792.
793.
794.
795.
796.
797.
798.
// Program.Shape
using Microsoft.FSharp.Core;
using System;
using System.Collections;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[Serializable]
[StructLayout(LayoutKind.Auto, CharSet = CharSet.Auto)]
[DebuggerDisplay("{__DebugDisplay(),nq}")]
[CompilationMapping(/*Could not decode attribute arguments.*/)]
public abstract class Shape : IEquatable<Shape>, IStructuralEquatable, IComparable<Shape>, IComparable, IStructuralComparable
{
	public static class Tags
	{
		public const int Rectangle = 0;

		public const int Circle = 1;

		public const int Prism = 2;
	}

	[Serializable]
	[DebuggerTypeProxy(typeof(Rectangle@DebugTypeProxy))]
	[DebuggerDisplay("{__DebugDisplay(),nq}")]
	public class Rectangle : Shape
	{
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal readonly double _width;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal readonly double _length;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		[field: DebuggerNonUserCode]
		public double width
		{
			[DebuggerNonUserCode]
			get;
		}

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		[field: DebuggerNonUserCode]
		public double length
		{
			[DebuggerNonUserCode]
			get;
		}

		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal Rectangle(double _width, double _length)
		{
			this._width = _width;
			this._length = _length;
		}
	}

	[Serializable]
	[DebuggerTypeProxy(typeof(Circle@DebugTypeProxy))]
	[DebuggerDisplay("{__DebugDisplay(),nq}")]
	public class Circle : Shape
	{
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal readonly double _radius;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		[field: DebuggerNonUserCode]
		public double radius
		{
			[DebuggerNonUserCode]
			get;
		}

		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal Circle(double _radius)
		{
			this._radius = _radius;
		}
	}

	[Serializable]
	[DebuggerTypeProxy(typeof(Prism@DebugTypeProxy))]
	[DebuggerDisplay("{__DebugDisplay(),nq}")]
	public class Prism : Shape
	{
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal readonly double _width;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal readonly double item2;

		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal readonly double _height;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		[field: DebuggerNonUserCode]
		public double width
		{
			[DebuggerNonUserCode]
			get;
		}

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		[field: DebuggerNonUserCode]
		public double Item2
		{
			[DebuggerNonUserCode]
			get;
		}

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		[field: DebuggerNonUserCode]
		public double height
		{
			[DebuggerNonUserCode]
			get;
		}

		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal Prism(double _width, double item2, double _height)
		{
			this._width = _width;
			this.item2 = item2;
			this._height = _height;
		}
	}

	internal class Rectangle@DebugTypeProxy
	{
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal Rectangle _obj;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		public double width
		{
			[CompilerGenerated]
			[DebuggerNonUserCode]
			get
			{
				return _obj._width;
			}
		}

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		public double length
		{
			[CompilerGenerated]
			[DebuggerNonUserCode]
			get
			{
				return _obj._length;
			}
		}

		[CompilerGenerated]
		[DebuggerNonUserCode]
		public Rectangle@DebugTypeProxy(Rectangle obj)
		{
			_obj = obj;
		}
	}

	internal class Circle@DebugTypeProxy
	{
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal Circle _obj;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		public double radius
		{
			[CompilerGenerated]
			[DebuggerNonUserCode]
			get
			{
				return _obj._radius;
			}
		}

		[CompilerGenerated]
		[DebuggerNonUserCode]
		public Circle@DebugTypeProxy(Circle obj)
		{
			_obj = obj;
		}
	}

	internal class Prism@DebugTypeProxy
	{
		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		internal Prism _obj;

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		public double width
		{
			[CompilerGenerated]
			[DebuggerNonUserCode]
			get
			{
				return _obj._width;
			}
		}

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		public double Item2
		{
			[CompilerGenerated]
			[DebuggerNonUserCode]
			get
			{
				return _obj.item2;
			}
		}

		[CompilationMapping(/*Could not decode attribute arguments.*/)]
		[CompilerGenerated]
		[DebuggerNonUserCode]
		public double height
		{
			[CompilerGenerated]
			[DebuggerNonUserCode]
			get
			{
				return _obj._height;
			}
		}

		[CompilerGenerated]
		[DebuggerNonUserCode]
		public Prism@DebugTypeProxy(Prism obj)
		{
			_obj = obj;
		}
	}

	[CompilerGenerated]
	[DebuggerNonUserCode]
	[DebuggerBrowsable(DebuggerBrowsableState.Never)]
	public int Tag
	{
		[CompilerGenerated]
		[DebuggerNonUserCode]
		get
		{
			return (this is Prism) ? 2 : ((this is Circle) ? 1 : 0);
		}
	}

	[CompilerGenerated]
	[DebuggerNonUserCode]
	[DebuggerBrowsable(DebuggerBrowsableState.Never)]
	public bool IsRectangle
	{
		[CompilerGenerated]
		[DebuggerNonUserCode]
		get
		{
			return this is Rectangle;
		}
	}

	[CompilerGenerated]
	[DebuggerNonUserCode]
	[DebuggerBrowsable(DebuggerBrowsableState.Never)]
	public bool IsCircle
	{
		[CompilerGenerated]
		[DebuggerNonUserCode]
		get
		{
			return this is Circle;
		}
	}

	[CompilerGenerated]
	[DebuggerNonUserCode]
	[DebuggerBrowsable(DebuggerBrowsableState.Never)]
	public bool IsPrism
	{
		[CompilerGenerated]
		[DebuggerNonUserCode]
		get
		{
			return this is Prism;
		}
	}

	[CompilerGenerated]
	[DebuggerNonUserCode]
	internal Shape()
	{
	}

	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static Shape NewRectangle(double _width, double _length)
	{
		return new Rectangle(_width, _length);
	}

	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static Shape NewCircle(double _radius)
	{
		return new Circle(_radius);
	}

	[CompilationMapping(/*Could not decode attribute arguments.*/)]
	public static Shape NewPrism(double _width, double item2, double _height)
	{
		return new Prism(_width, item2, _height);
	}

	[CompilerGenerated]
	[DebuggerNonUserCode]
	internal object __DebugDisplay()
	{
		return ExtraTopLevelOperators.PrintFormatToString<FSharpFunc<Shape, string>>(new PrintfFormat<FSharpFunc<Shape, string>, Unit, string, string, string>("%+0.8A")).Invoke(this);
	}

	[CompilerGenerated]
	public override string ToString()
	{
		return ExtraTopLevelOperators.PrintFormatToString<FSharpFunc<Shape, string>>(new PrintfFormat<FSharpFunc<Shape, string>, Unit, string, string, Shape>("%+A")).Invoke(this);
	}

	[CompilerGenerated]
	public sealed override int CompareTo(Shape obj)
	{
		if (this != null)
		{
			if (obj != null)
			{
				int num = (this is Prism) ? 2 : ((this is Circle) ? 1 : 0);
				int num2 = (obj is Prism) ? 2 : ((obj is Circle) ? 1 : 0);
				if (num == num2)
				{
					if (!(this is Rectangle))
					{
						if (this is Circle)
						{
							Circle circle = (Circle)this;
							Circle circle2 = (Circle)obj;
							IComparer genericComparer = LanguagePrimitives.get_GenericComparer();
							double radius = circle._radius;
							double radius2 = circle2._radius;
							if (radius < radius2)
							{
								return -1;
							}
							if (radius > radius2)
							{
								return 1;
							}
							if (radius == radius2)
							{
								return 0;
							}
							return HashCompare.GenericComparisonWithComparerIntrinsic<double>(genericComparer, radius, radius2);
						}
						if (this is Prism)
						{
							Prism prism = (Prism)this;
							Prism prism2 = (Prism)obj;
							IComparer genericComparer2 = LanguagePrimitives.get_GenericComparer();
							double width = prism._width;
							double width2 = prism2._width;
							int num3 = (width < width2) ? (-1) : ((width > width2) ? 1 : ((width != width2) ? HashCompare.GenericComparisonWithComparerIntrinsic<double>(genericComparer2, width, width2) : 0));
							if (num3 < 0)
							{
								return num3;
							}
							if (num3 > 0)
							{
								return num3;
							}
							IComparer genericComparer3 = LanguagePrimitives.get_GenericComparer();
							double item = prism.item2;
							double item2 = prism2.item2;
							int num4 = (item < item2) ? (-1) : ((item > item2) ? 1 : ((item != item2) ? HashCompare.GenericComparisonWithComparerIntrinsic<double>(genericComparer3, item, item2) : 0));
							if (num4 < 0)
							{
								return num4;
							}
							if (num4 > 0)
							{
								return num4;
							}
							IComparer genericComparer4 = LanguagePrimitives.get_GenericComparer();
							double height = prism._height;
							double height2 = prism2._height;
							if (height < height2)
							{
								return -1;
							}
							if (height > height2)
							{
								return 1;
							}
							if (height == height2)
							{
								return 0;
							}
							return HashCompare.GenericComparisonWithComparerIntrinsic<double>(genericComparer4, height, height2);
						}
					}
					Rectangle rectangle = (Rectangle)this;
					Rectangle rectangle2 = (Rectangle)obj;
					IComparer genericComparer5 = LanguagePrimitives.get_GenericComparer();
					double width3 = rectangle._width;
					double width4 = rectangle2._width;
					int num5 = (width3 < width4) ? (-1) : ((width3 > width4) ? 1 : ((width3 != width4) ? HashCompare.GenericComparisonWithComparerIntrinsic<double>(genericComparer5, width3, width4) : 0));
					if (num5 < 0)
					{
						return num5;
					}
					if (num5 > 0)
					{
						return num5;
					}
					IComparer genericComparer6 = LanguagePrimitives.get_GenericComparer();
					double length = rectangle._length;
					double length2 = rectangle2._length;
					if (length < length2)
					{
						return -1;
					}
					if (length > length2)
					{
						return 1;
					}
					if (length == length2)
					{
						return 0;
					}
					return HashCompare.GenericComparisonWithComparerIntrinsic<double>(genericComparer6, length, length2);
				}
				return num - num2;
			}
			return 1;
		}
		if (obj != null)
		{
			return -1;
		}
		return 0;
	}

	[CompilerGenerated]
	public sealed override int CompareTo(object obj)
	{
		return CompareTo((Shape)obj);
	}

	[CompilerGenerated]
	public sealed override int CompareTo(object obj, IComparer comp)
	{
		Shape shape = (Shape)obj;
		if (this != null)
		{
			if ((Shape)obj != null)
			{
				int num = (this is Prism) ? 2 : ((this is Circle) ? 1 : 0);
				Shape shape2 = shape;
				int num2 = (shape2 is Prism) ? 2 : ((shape2 is Circle) ? 1 : 0);
				if (num == num2)
				{
					if (!(this is Rectangle))
					{
						if (this is Circle)
						{
							Circle circle = (Circle)this;
							Circle circle2 = (Circle)shape;
							double radius = circle._radius;
							double radius2 = circle2._radius;
							if (radius < radius2)
							{
								return -1;
							}
							if (radius > radius2)
							{
								return 1;
							}
							if (radius == radius2)
							{
								return 0;
							}
							return HashCompare.GenericComparisonWithComparerIntrinsic<double>(comp, radius, radius2);
						}
						if (this is Prism)
						{
							Prism prism = (Prism)this;
							Prism prism2 = (Prism)shape;
							double width = prism._width;
							double width2 = prism2._width;
							int num3 = (width < width2) ? (-1) : ((width > width2) ? 1 : ((width != width2) ? HashCompare.GenericComparisonWithComparerIntrinsic<double>(comp, width, width2) : 0));
							if (num3 < 0)
							{
								return num3;
							}
							if (num3 > 0)
							{
								return num3;
							}
							double item = prism.item2;
							double item2 = prism2.item2;
							int num4 = (item < item2) ? (-1) : ((item > item2) ? 1 : ((item != item2) ? HashCompare.GenericComparisonWithComparerIntrinsic<double>(comp, item, item2) : 0));
							if (num4 < 0)
							{
								return num4;
							}
							if (num4 > 0)
							{
								return num4;
							}
							double height = prism._height;
							double height2 = prism2._height;
							if (height < height2)
							{
								return -1;
							}
							if (height > height2)
							{
								return 1;
							}
							if (height == height2)
							{
								return 0;
							}
							return HashCompare.GenericComparisonWithComparerIntrinsic<double>(comp, height, height2);
						}
					}
					Rectangle rectangle = (Rectangle)this;
					Rectangle rectangle2 = (Rectangle)shape;
					double width3 = rectangle._width;
					double width4 = rectangle2._width;
					int num5 = (width3 < width4) ? (-1) : ((width3 > width4) ? 1 : ((width3 != width4) ? HashCompare.GenericComparisonWithComparerIntrinsic<double>(comp, width3, width4) : 0));
					if (num5 < 0)
					{
						return num5;
					}
					if (num5 > 0)
					{
						return num5;
					}
					double length = rectangle._length;
					double length2 = rectangle2._length;
					if (length < length2)
					{
						return -1;
					}
					if (length > length2)
					{
						return 1;
					}
					if (length == length2)
					{
						return 0;
					}
					return HashCompare.GenericComparisonWithComparerIntrinsic<double>(comp, length, length2);
				}
				return num - num2;
			}
			return 1;
		}
		if ((Shape)obj != null)
		{
			return -1;
		}
		return 0;
	}

	[CompilerGenerated]
	public sealed override int GetHashCode(IEqualityComparer comp)
	{
		if (this != null)
		{
			int num = 0;
			if (!(this is Rectangle))
			{
				if (this is Circle)
				{
					Circle circle = (Circle)this;
					num = 1;
					return -1640531527 + (HashCompare.GenericHashWithComparerIntrinsic<double>(comp, circle._radius) + ((num << 6) + (num >> 2)));
				}
				if (this is Prism)
				{
					Prism prism = (Prism)this;
					num = 2;
					num = -1640531527 + (HashCompare.GenericHashWithComparerIntrinsic<double>(comp, prism._height) + ((num << 6) + (num >> 2)));
					num = -1640531527 + (HashCompare.GenericHashWithComparerIntrinsic<double>(comp, prism.item2) + ((num << 6) + (num >> 2)));
					return -1640531527 + (HashCompare.GenericHashWithComparerIntrinsic<double>(comp, prism._width) + ((num << 6) + (num >> 2)));
				}
			}
			Rectangle rectangle = (Rectangle)this;
			num = 0;
			num = -1640531527 + (HashCompare.GenericHashWithComparerIntrinsic<double>(comp, rectangle._length) + ((num << 6) + (num >> 2)));
			return -1640531527 + (HashCompare.GenericHashWithComparerIntrinsic<double>(comp, rectangle._width) + ((num << 6) + (num >> 2)));
		}
		return 0;
	}

	[CompilerGenerated]
	public sealed override int GetHashCode()
	{
		return GetHashCode(LanguagePrimitives.get_GenericEqualityComparer());
	}

	[CompilerGenerated]
	public sealed override bool Equals(object obj, IEqualityComparer comp)
	{
		if (this != null)
		{
			Shape shape = obj as Shape;
			if (shape != null)
			{
				Shape shape2 = shape;
				int num = (this is Prism) ? 2 : ((this is Circle) ? 1 : 0);
				Shape shape3 = shape2;
				int num2 = (shape3 is Prism) ? 2 : ((shape3 is Circle) ? 1 : 0);
				if (num == num2)
				{
					if (!(this is Rectangle))
					{
						if (this is Circle)
						{
							Circle circle = (Circle)this;
							Circle circle2 = (Circle)shape2;
							return circle._radius == circle2._radius;
						}
						if (this is Prism)
						{
							Prism prism = (Prism)this;
							Prism prism2 = (Prism)shape2;
							if (prism._width == prism2._width)
							{
								if (prism.item2 == prism2.item2)
								{
									return prism._height == prism2._height;
								}
								return false;
							}
							return false;
						}
					}
					Rectangle rectangle = (Rectangle)this;
					Rectangle rectangle2 = (Rectangle)shape2;
					if (rectangle._width == rectangle2._width)
					{
						return rectangle._length == rectangle2._length;
					}
					return false;
				}
				return false;
			}
			return false;
		}
		return obj == null;
	}

	[CompilerGenerated]
	public sealed override bool Equals(Shape obj)
	{
		if (this != null)
		{
			if (obj != null)
			{
				int num = (this is Prism) ? 2 : ((this is Circle) ? 1 : 0);
				int num2 = (obj is Prism) ? 2 : ((obj is Circle) ? 1 : 0);
				if (num == num2)
				{
					if (!(this is Rectangle))
					{
						if (this is Circle)
						{
							Circle circle = (Circle)this;
							Circle circle2 = (Circle)obj;
							double radius = circle._radius;
							double radius2 = circle2._radius;
							if (radius == radius2)
							{
								return true;
							}
							if (radius != radius)
							{
								return radius2 != radius2;
							}
							return false;
						}
						if (this is Prism)
						{
							Prism prism = (Prism)this;
							Prism prism2 = (Prism)obj;
							double width = prism._width;
							double width2 = prism2._width;
							if (width == width2 || (width != width && width2 != width2))
							{
								double item = prism.item2;
								double item2 = prism2.item2;
								if (item == item2 || (item != item && item2 != item2))
								{
									double height = prism._height;
									double height2 = prism2._height;
									if (height == height2)
									{
										return true;
									}
									if (height != height)
									{
										return height2 != height2;
									}
									return false;
								}
								return false;
							}
							return false;
						}
					}
					Rectangle rectangle = (Rectangle)this;
					Rectangle rectangle2 = (Rectangle)obj;
					double width3 = rectangle._width;
					double width4 = rectangle2._width;
					if (width3 == width4 || (width3 != width3 && width4 != width4))
					{
						double length = rectangle._length;
						double length2 = rectangle2._length;
						if (length == length2)
						{
							return true;
						}
						if (length != length)
						{
							return length2 != length2;
						}
						return false;
					}
					return false;
				}
				return false;
			}
			return false;
		}
		return obj == null;
	}

	[CompilerGenerated]
	public sealed override bool Equals(object obj)
	{
		Shape shape = obj as Shape;
		if (shape != null)
		{
			return Equals(shape);
		}
		return false;
	}
}

...
Рейтинг: 0 / 0
Discriminated Unions в C#
    #39845677
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВо вполне обычные классы.
Интересно, когда декомпиляторы обучатся фиче "Invert if to reduce nesting"?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Discriminated Unions в C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]