Компиляция общего интерфейса с общим словом abstract class & params

Рассмотрим пример followng - это использует интерфейс:

public interface IAlgorithm<TResult, TInput>
{
    TResult Compute(TInput input);
}

class A : IAlgorithm<int, byte[]>
{
    // Notice the use of params...not strictly what the interface specifies but it works.
    public int Compute(params byte[] input)
    {
        // no sane developer would go to this length to prove a point
        return input[0];
    }
}

A inst = new A();
Console.WriteLine(inst.Compute(1, 2, 3));
// 1

В этом примере показан интерфейс, в котором реализация метода (params byte[]) не соответствует договору интерфейса (byte[])... но он работает!

Рассмотрим пример followng - это использует абстрактный класс:

public abstract class Algorithm<TResult, TInput>
{
    public abstract TResult Compute(TInput input);
}

class A : Algorithm<int, byte[]>
{
    // Notice the use of params...not strictly what the abstract class specifies, and it causes the compile to burst into tears!
    public override int Compute(params byte[] input)
    {
        // no sane developer would go to this length to prove a point
        return input[0];
    }
}

A inst = new A();
Console.WriteLine(inst.Compute(1, 2, 3));
//Compiler error: No overload for method 'Compute' takes 3 arguments

Я хочу знать, почему это работает для интерфейса, но не для абстрактного класса?

Ответы