关键字会影响编译器强制转换?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (39)

希望编译器的行为:

interface IFoo<T>
{
    T Get();
}

class FooGetter : IFoo<int>
{
    public int Get()
    {
        return 42;
    }
}

以下内容编译并运行:

static class FooGetterGetter
{
    public static IFoo<T> Get<T>()
    {
        return (IFoo<T>)new FooGetter();
    }
}

如果我们更改Foo类并添加sealed关键词:

sealed class FooGetter : IFoo<int> // etc

然后,在下面的行中得到一个编译器错误:

 return (IFoo<T>)new FooGetter();
提问于
用户回答回答于

因为FooGetter是一个明确的实现,IFoo<int>而不是IFoo<T>一般的实现。由于它是封闭的,编译器知道没有办法将它转换为通用的,IFoo<T>如果T不是其他任何东西int。如果没有密封,编译器会允许它在运行时编译并抛出异常,如果T不是int

如果尝试将其用于除int(例如FooGetterGetter.Get<double>();)以外的其他任何内容,则会发生异常

用户回答回答于

任何派生类都可以实现IFoo<T>:

class MyClass : FooGetter, IFoo<double> { }

何时FooGetter标记为密封的

所属标签

可能回答问题的人

  • 红双喜经典VS中华

    1 粉丝0 提问8 回答
  • 浮生长恨欢娱少

    个人站长 · 站长 (已认证)

    51 粉丝2 提问4 回答
  • LemonLu

    社区 · 运营 (已认证)

    45 粉丝0 提问4 回答
  • 滑稽园扛把子

    Swoole Inc · PHP工程师 (已认证)

    135 粉丝0 提问4 回答

扫码关注云+社区