为什么 C# 允许从 "new Shell32.Shell()" 中的接口构造对象?

Why does C# allow constructing an object from an interface in "new Shell32.Shell()"?

我知道在 C# 中通常不能创建抽象 class 或接口的实例。谁能帮我理解这段代码(编译没有任何错误)。

Shell32.Shell shObj = new Shell32.Shell();

Shell32.Shell 是来自 'shell32.dll'

的接口

我尝试了以下方法,但没有编译:

[CoClass(typeof(ShellClass))]
[Guid("286E6F1B-7113-4355-9562-96B7E9D64C54")]
public interface OtherShell : Shell
{
}
OtherShell shObj = new OtherShell();

更新:

为了让它工作,我只需要添加 ComImport 属性并更改 co-class(我不能选择 Shell32.ShellClass)。

谢谢大家!

如果您在 Shell32.Shell 上的 Visual Studio 中右键单击并转到定义,您将获得以下接口定义:

using System.Runtime.InteropServices;

namespace Shell32
{
    [CoClass(typeof(ShellClass))]
    [Guid("286E6F1B-7113-4355-9562-96B7E9D64C54")]
    public interface Shell : IShellDispatch6
    {
    }
}

对 ShellClass 执行相同操作,您将获得在您的代码中创建的具体 class:

Shell32.Shell shObj = new Shell32.Shell();

除了所有其他信息外,这里是如何编译代码的结果。接口的使用仅仅是代码的精巧。

IL_000c: newobj       instance void [Interop.Shell32]Shell32.ShellClass::.ctor()

也就是说,它是编译时从接口"to"到class的转换,基于[CoClass]属性。

Per,,显示了一个最小的示例:

[In addition to CoClassAttribute, you] need both the ComImportAttribute and the GuidAttribute for it to work.