You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

显式转换未实现接口的类型:编译通过但运行报错

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:06:13