Когда я должен или не должен использовать ограничения общего типа?

У меня есть базовый класс:

public abstract class StuffBase
{
    public abstract void DoSomething();
}

И два производных класса

public class Stuff1 : StuffBase
{
    public void DoSomething()
    {
        Console.WriteLine("Stuff 1 did something cool!");
    }
    public Stuff1()
    {
        Console.WriteLine("New stuff 1 reporting for duty!");
    }
}

public class Stuff2 : StuffBase
{
    public void DoSomething()
    {
        Console.WriteLine("Stuff 2 did something cool!");
    }
    public Stuff1()
    {
        Console.WriteLine("New stuff 2 reporting for duty!");
    }
}

Хорошо, теперь скажите, что у меня есть список предметов:

var items = new List<StuffBase>();
items.Add(new Stuff1());
items.Add(new Stuff2());

и я хочу, чтобы все они вызывали свой метод DoSomething (). Я мог бы ожидать итерации списка и вызова их метода DoSomething (), поэтому предположим, что у меня есть метод для этого, который называется AllDoSomething (), который просто выполняет итерацию по списку и выполняет работу:

public static void AllDoSomething(List<StuffBase> items)
{
    items.ForEach(i => i.DoSomething());
}

В чем практическая разница следующего метода?

public static void AllDoSomething<T>(List<T> items) where T: StuffBase
{
    items.ForEach(i => i.DoSomething());
}

Оба метода выглядят в реальном выражении, хотя и синтаксически разные, чтобы делать то же самое.

Это просто разные способы сделать одно и то же? Я понимаю общие и типовые ограничения, но не могу понять, почему я использовал бы один способ по сравнению с другим в этом случае.

Ответы на вопрос(3)

Ваш ответ на вопрос