Новое консольное приложение C# .NET Core:
using System;
namespace Interface_Sealed
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(new C().X);
Console.WriteLine((new C() as I).X);
Console.ReadKey();
}
interface I
{
sealed int X => 0;
}
class C: I
{
public int X => 1;
}
}
}
При запуске выводит на консоль "10". Первый ".X" вызывает реализацию X в классе C, а второй вызывает реализацию по умолчанию на интерфейсе I.
Почему C# позволяет мне объявить реализацию X по умолчанию как «запечатанную», а затем разрешить мне переопределить ее другой реализацией без жалоб? Почему имеет значение, получаю ли я доступ к X через ссылку типа I или типа C?
NB. Если вы реализуете I.X в C явно, а не неявно, вы получите CS0539 «'Program.C.X' в явном объявлении интерфейса не найден среди элементов интерфейса, которые могут быть реализованы». На странице документации Microsoft по этой ошибке указано, что это происходит, когда «предпринята попытка явно объявить член интерфейса, который не существует». Ну, это неправда, не так ли? Он существует.