Farklı boyutta geometrik varlıkları ile çalışabilir C # genel algoritmaları yazmaya çalışıyorum.
Ben şu yapmacık örnekte Point2
ve Point3
hem basit uygulayan IPoint
bir 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 Point4
ama GetDim<Point4>
mevcut değil). Ancak, derleyici özel bir uygulama aramak için rahatsız edici görünmüyor.
NumDims
mülkün kullanılabilir olduğunu garanti etmektir. Neden bazı durumlarda görmezden geliyorsun?