public static void Main()
TwoTuple<float> Coords = new TwoTuple<float>(1.1f, 2.2f);
BarDataPoint test = new BarDataPoint(Coords, 3.3f);
public interface ITuple<T>
public struct TwoTuple<T> : ITuple<T>
public TwoTuple(T x, T y)
public override string ToString()
return "(" + X + ", " + Y + ")";
public struct ThreeTuple<T> : ITuple<T>
public ThreeTuple(T x, T y, T z)
public override string ToString()
return "(" + X + ", " + Y + ", " + Z + ")";
public interface IDataPoint<T,T2> where T : ITuple<T2>
public struct BarDataPoint : IDataPoint<TwoTuple<float>,float>
public TwoTuple<float> Coords { get; }
public float Value { get; }
public BarDataPoint(TwoTuple<float> Coords, float Value)
public override string ToString()
return "Coordinates: " + Coords + "; Value: " + Value;