显式转换未实现接口的类型:编译通过但运行报错
关于C#类与未实现接口的显式转换问题
首先定义如下类与接口:
internal class DoStuff { public int X { get; } public void Do() => WriteLine(X); public DoStuff(int X) => this.X = X; } internal interface IDoStuff { void Do(); }
DoStuff类并未实现IDoStuff接口,理论上不存在隐式转换,但Visual Studio的智能提示中却提供了显式转换选项。我原本推测:只要类与接口的方法签名完全一致,即使不声明接口实现,也能完成转换;还误以为接口实现声明仅用于显式实现的场景。
我曾看到2011年的Stack Overflow帖子指出这种操作不可行,但认为C#版本更新后已经支持该特性,于是用C# 11/.NET 6编写了以下顶级代码测试:
// Program.cs: using static System.Console; DoStuff d = new(2); IDoStuff i = (IDoStuff)d; i.Do(); return;
代码能够正常编译,但运行时第3行抛出InvalidCastException异常:
System.InvalidCastException: Unable to cast object of type DoStuff to type IDoStuff.
这让我非常困惑,那篇2011年帖子的结论如今是否仍然适用?
若结论仍适用,我有三个问题:
- 既然这种转换必然失败,C#编译器为何不直接抛出编译错误?
- C#至今不支持从拥有匹配方法签名的类转换到未实现的接口,背后的阻碍因素是什么?
- 我隐约记得结构相同的不同类之间可以显式转换,这是否属实?若属实,与接口转换有何区别?
若结论已不适用,那此次转换失败的原因是什么?
内容的提问来源于stack exchange,提问作者Brendan Lynn
相关产品推荐
相关产品推荐

