gpt4 book ai didi

c# - 为什么当我将类转换为它未实现的接口(interface)时没有编译器错误?

转载 作者:可可西里 更新时间:2023-11-01 08:59:32 25 4
gpt4 key购买 nike

如果我尝试从一个类到一个接口(interface)的无效转换,那么编译器不会报错(错误发生在运行时);但是,如果我尝试对抽象类进行类似的转换,它确实会提示。

class Program
{
abstract class aBaz
{
public abstract int A { get; }
}

interface IBar
{
int B { get; }
}

class Foo
{
public int C { get; }
}

static void Main()
{
Foo foo = new Foo();

// compiler error, as expected, since Foo doesn't inherit aBaz
aBaz baz = (aBaz)foo;

// no compiler error, even though Foo doesn't implement IBar
IBar bar = (IBar)foo;
}
}

为什么编译器不拒绝从 FooIBar 的转换,当它(看似?)无效时?或者,换个问题,如果编译器允许对接口(interface) IBar 进行这种“无效”转换,为什么不允许对抽象类 aBaz ?

最佳答案

您需要了解 .Net 的继承系统才能明白为什么这是有道理的。在.Net 中,一个类只能继承自一个基类,但可以实现任意数量的接口(interface)。

class Program
{
abstract class aBaz
{
public abstract int A { get; }
}

interface IBar
{
int B { get; }
}

class Foo
{
public int C { get; }
}

class BarableFoo : Foo, IBar
{
public int C { get; }
}

static void Main()
{
// This is why the compiler doesn't error on the later cast
Foo foo = new BarableFoo();

// compiler error: aBaz is a class and the compiler knows that
// Foo is not a _subclass_ of aBaz.
aBaz baz = (aBaz)foo;

// no compiler error: the class Foo does not implement IBar, however at runtime
// this instance, "foo", might be a subclass of Foo that _implements_ IBar.
// This is perfectly valid, and succeeds at runtime.
IBar bar = (IBar)foo;

// On the other hand...
foo = new Foo();

// This fails at runtime as expected.
bar = (IBar)foo;
}

}

在问题中极其简单的原始示例中,编译器似乎可以检测到 foo 的这个实例永远不会转换为 IBar,但这更像是一个“nice to have”警告,而不是一个问题语言正确性。

关于c# - 为什么当我将类转换为它未实现的接口(interface)时没有编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12335757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com