Я намагаюся записати загальні алгоритми в 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властивості. Чому ви її ігноруєте в деяких випадках?