在转换为错误类型时没有编译时错误

GPu*_*uri 5 c#

我的问题是关于不同界面中的类型转换

假设我有一个界面

public interface I
{
    void method();
}
Run Code Online (Sandbox Code Playgroud)

实现它的类

public class C : I
{
    public void method()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我有另一个界面

public interface I1
{
    void method1();
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我做这样的事情

C c1 = new C();
((I1)c1).method1();
Run Code Online (Sandbox Code Playgroud)

它抛出运行时异常而不是编译时错误

Sco*_*ain 12

因为C没有标记sealed我可能会这样做

public D : C, I1
{
    public void method1()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

这将使以下代码完全合法.

C c1 = new D();
((I1)c1).method1();
Run Code Online (Sandbox Code Playgroud)

如果C被标记sealed,则应该得到编译时错误,因为不存在可以实现接口的更多派生类.

public sealed class C : I
{
    public void method()
    {
    }
}

//You should now get the compile time error "Cannot convert type 'SandboxConsole.C' to 'SandboxConsole.I1'"
Run Code Online (Sandbox Code Playgroud)