В моем проекте я нашел странную ситуацию, которая кажется полностью действительной в С#, потому что у меня нет ошибок времени компиляции.
Упрощенный пример выглядит следующим образом:
using System;
using System.Collections.Generic;
namespace Test
{
interface IFoo
{
void FooMethod();
}
class A
{
public void FooMethod()
{
Console.WriteLine("implementation");
}
}
class B : A, IFoo
{
}
class Program
{
static void Main(string[] args)
{
IFoo foo = new B();
foo.FooMethod();
}
}
}
Такой код компилируется. Однако обратите внимание, что A не IFoo, а B не реализует методы IFoo. В моем случае, случайно (после рефакторинга), A имеет метод с той же сигнатурой. Но почему A знает, как реализовать FooMethod интерфейса IFoo? A даже не знает, что IFoo существует.
Для меня такая конструкция опасна. Поскольку каждый раз, когда я реализую некоторый интерфейс, я должен проверить, не мешает ли каждый метод в этом интерфейсе методам базового класса.
Если это "чистая функция С#"? Как это называется? Я что-то пропустил?