Marco Marco - 1 month ago 8
C# Question

C# Generic Method, cannot implicit convert

I've got the following code:

public static T GetCar<T>() where T : ICar
{
T objCar = default(T);

if (typeof(T) == typeof(SmallCar)) {
objCar = new SmallCar("");
} else if (typeof(T) == typeof(MediumCar)) {
objCar = new MediumCar("");
} else if (typeof(T) == typeof(BigCar)) {
objCar = new BigCar("");
}

return objCar;
}


And this is the error I am getting:
Cannot implicitly convert type 'Test.Cars' to 'T'


What Am I missing here? All car types implement the ICar interface.

Thanks

Answer

You cannot convert to T because of the fact that T isn't known at compile time. If you want to get your code to work you can change the return type to ICar and remove the generic T return type.

You also can cast to T. This would work too. If you only using the default constructor you can also constain on new() and use new T() to get your code to work.

Samples

public ICar GetCar<T>()
    where T : ICar
{
    ICar objCar = null;

    if (typeof(T) == typeof(SmallCar)) {
        objCar = new SmallCar();
    } else if (typeof(T) == typeof(MediumCar)) {
        objCar = new MediumCar();
    } else if (typeof(T) == typeof(BigCar)) {
        objCar = new BigCar();
    }

    return objCar;
}

Cast:

public T GetCar<T>()
    where T : ICar
{
    Object objCar = null;

    if (typeof(T) == typeof(SmallCar)) {
        objCar = new SmallCar();
    } else if (typeof(T) == typeof(MediumCar)) {
        objCar = new MediumCar();
    } else if (typeof(T) == typeof(BigCar)) {
        objCar = new BigCar();
    }

    return (T)objCar;
}

New-constraint:

public T GetCar<T>()
    where T : ICar, new
{
    return new T();
}
Comments