Saya mencoba untuk menulis algoritma umum dalam C # yang dapat bekerja dengan entitas geometris dari dimensi yang berbeda.
Dalam contoh berikut yang saya buat Point2dan Point3, keduanya mengimplementasikan IPointantarmuka sederhana .
Sekarang saya memiliki fungsi GenericAlgorithmyang memanggil fungsi GetDim. Ada beberapa definisi fungsi ini berdasarkan jenisnya. Ada juga fungsi mundur yang didefinisikan untuk apa pun yang mengimplementasikan IPoint.
Saya awalnya mengharapkan output dari program berikut ini menjadi 2, 3. Namun, itu adalah 0, 0.
interface IPoint {
public int NumDims { get; }
}
public struct Point2 : IPoint {
public int NumDims => 2;
}
public struct Point3 : IPoint {
public int NumDims => 3;
}
class Program
{
static int GetDim<T>(T point) where T: IPoint => 0;
static int GetDim(Point2 point) => point.NumDims;
static int GetDim(Point3 point) => point.NumDims;
static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim(point);
static void Main(string[] args)
{
Point2 p2;
Point3 p3;
int d1 = GenericAlgorithm(p2);
int d2 = GenericAlgorithm(p3);
Console.WriteLine("{0:d}", d1); // returns 0 !!
Console.WriteLine("{0:d}", d2); // returns 0 !!
}
}
OK, jadi karena alasan tertentu informasi tipe konkret hilang GenericAlgorithm. Saya tidak sepenuhnya mengerti mengapa ini terjadi, tetapi baik-baik saja. Jika saya tidak dapat melakukannya dengan cara ini, alternatif apa lagi yang saya miliki?
GetDim(yaitu saya melewati Point4tetapi GetDim<Point4>tidak ada). Namun, tampaknya kompiler tidak peduli untuk mencari implementasi khusus.
NumDimsproperti tersedia. Mengapa Anda mengabaikannya dalam beberapa kasus?