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);
}

Если же вы хотите узнать почему ваш пример не работает, напишите в комментариях

→ Ссылка