using System.Collections.Generic;
using System.Collections;
public interface ICreatable<TArgument, TResult>
public abstract static TResult Create(TArgument arg);
public static void Method<T> (T a) where T : ICreatable<float[,], T>
var t = T.Create(new [,] { { 1f, 2f }, {3f, 4f} });
Console.WriteLine(JsonSerializer.Serialize(t));
public partial class Matrix2DFloat : ICreatable<float[,], Matrix2DFloat>
public Matrix2DFloat(float[,] array) => this.array = array ?? throw new ArgumentNullException(nameof(array));
#region ICreatable<float[,], Matrix2DFloat> Members
public static Matrix2DFloat Create(float[,] arg) => new Matrix2DFloat(arg);
public partial class Matrix2DFloat : IEnumerable<IEnumerable<float>>
public IEnumerator<IEnumerable<float>> GetEnumerator() =>
Enumerable.Range(0, array.GetLength(0)).Select(i => Enumerable.Range(0, array.GetLength(1)).Select(j => array[i, j])).GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
public static void Main()
A.Method(new Matrix2DFloat( new [,] { { 1f }, {3f} }));