ฉันกำลังพยายามเขียนอัลกอริทึมทั่วไปใน C # ที่สามารถทำงานกับหน่วยงานทางเรขาคณิตในมิติที่แตกต่างกัน
ในตัวอย่างที่วางแผนไว้ต่อไปนี้ฉันมีPoint2
และPoint3
ทั้งสองใช้IPoint
อินเทอร์เฟซที่เรียบง่าย
ตอนนี้ฉันมีฟังก์ชั่นที่เรียกฟังก์ชั่นGenericAlgorithm
GetDim
มีหลายคำจำกัดความของฟังก์ชั่นนี้ขึ้นอยู่กับประเภท IPoint
นอกจากนี้ยังมีฟังก์ชั่นฤดูใบไม้ร่วงหลังที่กำหนดไว้สำหรับสิ่งที่ดำเนินการ
ตอนแรกฉันคาดว่าผลลัพธ์ของโปรแกรมต่อไปนี้จะเป็น 2, 3 อย่างไรก็ตามมันคือ 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 !!
}
}
GenericAlgorithm
ตกลงดังนั้นด้วยเหตุผลบางประเภทข้อมูลที่เป็นรูปธรรมจะหายไปใน ฉันไม่เข้าใจว่าทำไมสิ่งนี้ถึงเกิดขึ้น แต่ก็ดี ถ้าฉันทำแบบนี้ไม่ได้ฉันมีทางเลือกอื่นอีกไหม?
GetDim
(เช่นฉันผ่านPoint4
แต่GetDim<Point4>
ไม่มีอยู่) อย่างไรก็ตามดูเหมือนว่าคอมไพเลอร์จะรบกวนการใช้งานแบบพิเศษ
NumDims
คุณสมบัติพร้อมใช้งาน ทำไมคุณถึงเพิกเฉยในบางกรณี