Farklı boyutta geometrik varlıkları ile çalışabilir C # genel algoritmaları yazmaya çalışıyorum.
Ben şu yapmacık örnekte Point2ve Point3hem basit uygulayan IPointbir arayüz.
Şimdi bir işlevi GenericAlgorithmçağıran bir fonksiyon var GetDim. Bu işlevin türe bağlı olarak birden fazla tanımı vardır. Ayrıca, uygulayan her şey için tanımlanmış bir geri dönüş işlevi de vardır IPoint.
Başlangıçta aşağıdaki programın çıktısının 2, 3 olmasını bekledim. Ancak, 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 !!
}
}
Tamam, bu yüzden somut tipteki bilgiler kaybolur GenericAlgorithm. Bunun neden olduğunu tam olarak anlamıyorum, ama iyi. Bu şekilde yapamazsam, başka hangi alternatiflerim var?
GetDim(yani geçiyorum Point4ama GetDim<Point4>mevcut değil). Ancak, derleyici özel bir uygulama aramak için rahatsız edici görünmüyor.
NumDimsmülkün kullanılabilir olduğunu garanti etmektir. Neden bazı durumlarda görmezden geliyorsun?