У меня есть структура, которая выглядит следующим образом:C# Оператора Перегрузка Использования Подкласса Generic в
public struct Vector2d<T> where T : Unit {
public double x;
public double y;
...
public static Vector2d<Length> operator * (Vector2d<Speed> speed, Vector2d<Duration> duration) {
return new Vector2d<Length>(speed.x * duration.x, speed.y * duration.y);
}
}
длиной, скорость и типы дюрации все подтипы группы. (Т наследует от блока, а)
Однако компилятор говорит:
One of the parameters of a binary operator must be the containing type.
Это кажется мне странным, потому что типы, предоставляемые являются подклассы содержащего типа.
Почему я пытаюсь сделать незаконным?
Я знаю, что Vector2 не является подклассом Vector2, но я не пытаюсь использовать значения типа generic. Все данные, используемые в операторе, - это класс Vector2.
Это незаконно, потому что разработчики языка сделали это незаконным. Сообщение об ошибке сообщает вам точно ограничение, которое описывает спецификация C#. Компилятор просто следит за спецификацией. Если вы хотите знать «почему?» вам нужно спросить у дизайнеров языка, и даже тогда их рассуждения могут основываться главным образом на их собственном мнении. –
Не знаете, почему этот вопрос был опущен ... совершенно правильный вопрос с кодом и четким вопросом. +1 от меня. – CodingYoshi
Я рекомендую не пытаться представлять единичный анализ с помощью дженериков. Единицы - это то, что действительно нужно встроить в язык. См. Например, аннотации типа F #. https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/units-of-measure –