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

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

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

希望编译器的行为:

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标记为密封的

扫码关注云+社区