Я пытаюсь написать универсальные алгоритмы на 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
свойство доступно. Почему вы игнорируете это в некоторых случаях?