C#. Хочу реализовать обобщенный Math.Lerp()
Мне нужен универсальный Math.Lerp, чтобы он работал как с float, так и с Vector (по части Unity).
Вот пример кода, который, я уверен, будет работать, но у компилятора возникают трудности, чтобы понять это.
public static T Lerp<T>(T a, T b, float t)
{
if (typeof(T) == typeof(float))
{
return Mathf.Lerp(a, b, t);
}
if (typeof(T) == typeof(Vector3))
{
return Vector3.Lerp(a, b, t);
}
throw new Exception("Вы пытаетесь сгладить не числовой тип!");
}
На что он жалуется? А вот:
Для float: Argument type 'T' is not assignable to parameter type 'float'
Для Vector3: Argument type 'T' is not assignable to parameter type 'UnityEngine.Vector3'
Думаю, если прочитать этот кусок кода станет понятно. Что он не понимает, что, после условия передаваемый T - 100%, например, float.
Вот в чем и вопрос - как сделать так, что бы компилятор понял мою идею? Может быть есть какой то более простой или, наоборот, изощрённый способ? Буду рад любым идеям.
Ответы (1 шт):
Для вас подойдёт Перегрузка методов.
Просто объявите 2 метода с одним названием, но разной сигнатурой:
public static float Lerp(float a, float b, float v)
{
return Math.Lerp(a, b, v);
}
public static Vector3 Lerp(Vector3 a, Vector3 b, float v)
{
return Vector3.Lerp(a, b, v);
}
Если же вы хотите узнать почему ваш пример не работает, напишите в комментариях