Tôi đang cố gắng viết các thuật toán chung trong C # có thể hoạt động với các thực thể hình học có kích thước khác nhau.
Trong ví dụ giả định sau đây tôi có Point2
và Point3
, cả hai đều thực hiện một IPoint
giao diện đơn giản .
Bây giờ tôi có một chức năng GenericAlgorithm
gọi một chức năng GetDim
. Có nhiều định nghĩa về chức năng này dựa trên loại. Ngoài ra còn có một chức năng dự phòng được xác định cho bất cứ điều gì thực hiện IPoint
.
Ban đầu tôi dự kiến đầu ra của chương trình sau là 2, 3. Tuy nhiên, nó là 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, vì một số lý do, thông tin loại bê tông bị mất GenericAlgorithm
. Tôi không hiểu tại sao điều này xảy ra, nhưng tốt thôi. Nếu tôi không thể làm theo cách này, tôi có những lựa chọn thay thế nào khác?
GetDim
(tức là tôi vượt qua Point4
nhưng GetDim<Point4>
không tồn tại). Tuy nhiên, dường như cả hai trình biên dịch đều không tìm kiếm một triển khai chuyên biệt.
NumDims
tài sản có sẵn. Tại sao bạn lại bỏ qua nó trong một số trường hợp?