Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在为接口创建实例时它在C#中工作?_C#_Com_Ironpython - Fatal编程技术网

为什么在为接口创建实例时它在C#中工作?

为什么在为接口创建实例时它在C#中工作?,c#,com,ironpython,C#,Com,Ironpython,编辑:我找到了关于C#和COM的相关页面: 正如在标题中,当我将C#中的程序转换为IronPython时,我无法创建类的实例 原始C#程序:IAgilent34980A2主机=新Agilent34980A() 重写的IronPython程序:host=Agilent34980A() C#程序运行良好,而IronPython程序会出现如下错误: TypeError:无法创建Agilent34980A的实例,因为它是抽象的 实际上Agilent34980A()是一个接口,因此错误是合理的 我的问题是

编辑:我找到了关于C#和COM的相关页面:

正如在标题中,当我将C#中的程序转换为IronPython时,我无法创建类的实例

原始C#程序:
IAgilent34980A2主机=新Agilent34980A()

重写的IronPython程序:
host=Agilent34980A()

C#程序运行良好,而IronPython程序会出现如下错误:

TypeError:无法创建Agilent34980A的实例,因为它是抽象的

实际上Agilent34980A()是一个接口,因此错误是合理的

我的问题是为什么它在C#中工作?实例也不能在C中创建,C是一个接口,对吗?

补充:

C代码来自测试机标记

源代码的IAgilent34980A2定义部分如下:

使用Ivi.Driver.Interop

使用制度

使用System.Runtime.InteropServices

名称空间Agilent.Agilent34980A.Interop

{

}

Agilent34980A定义部分

使用System.Runtime.InteropServices

名称空间Agilent.Agilent34980A.Interop

{

}

和河流定义部分

使用制度

使用System.Runtime.InteropServices

命名空间Ivi.Driver.Interop

{


不能在C#中创建接口的实例。 示例代码:

void Main()
{
    var test = new ITest();
}

interface ITest {
    void Test();
}
将出现编译错误:

Cannot create an instance of the abstract class or interface "UserQuery.ITest"
问题在于您的类没有正确地声明为库中的接口

代码如下:

IAgilent34980A host = new Agilent34980();

有效,因为它意味着“变量'host'是对某个对象的引用,该对象是实现IAgilent34980A接口的类的实例”。C#非平凡对象是引用类型,因此,这是有效的。

实际上,您可以通过具有
[CoClass]
[Guid]的co类创建接口实例
属性

使您能够:

[Guid("000208D5-0000-0000-C000-000000000046")] // Anything
[CoClass(typeof(Foo))]
[ComImport]
public interface IFoo { void Bar(); }

public class Foo : IFoo { public void Bar() { return; } }

void Main()
{
    IFoo instance = new IFoo();
}

IronPython支持接口吗?听起来你需要找一位IronPython专家谢谢你,DJ KRAZE。正如你所说,我应该找一位IronPython专家。但在此之前,我真的不明白为什么它在C#中工作得很好,尽管Agilent34980()是一个界面。看看这个,也许你可以用这个例子来处理你的案例。你能再检查一下你的代码吗?你的问题使用了
IAgilent34980A
Agilent34980
Agilent34980A
,我不确定这是问题的一部分,还是仅仅是一个打字错误。在c中列出这三种类型的定义。ba基于通用命名约定IAgilent34980A主机=新Agilent34980();IAgilent34980A-->接口Agilent34980-->类实现该接口。这在C#中是完全合法的。您不是在创建接口对象,而是在创建实现该接口的类的对象。从外观上看,他/她不是在尝试在C#中创建接口实例,而是在C#中创建实现接口-C的类实例f、
IAgilent34980A host=new agilent34980a();
不,这不是创建接口的实例。他实例化的是一个类(agilent34980a),而不是接口。然后他将该类分配给该接口的一个变量(host),因此该类必须实现该接口,这看起来是这样的(没有编译器错误).好的,从这个问题来看,在我看来,作者认为这实际上是他正在实例化的接口。我解释说实例化接口确实是不可能的,并详细说明实际发生了什么(参见编辑的答案),感谢您的回答。我编辑了我的消息中的接口定义部分。“Agilent34980A()”被定义为接口。-1:错误CS0144:现在无法创建抽象类或接口“IFoo”+1的实例;p添加了缺失的位,现在可以编译。有趣的是;p C#编译器将
new IFoo()
替换为
new Foo()
,感谢您的回复。我在我的邮件中编辑了接口定义部分。“Agilent34980A()“定义为接口。@shihuan83:解决方案是实例化
Agilent34980AClass
或使用
Marshall
类中的方法。
Cannot create an instance of the abstract class or interface "UserQuery.ITest"
IAgilent34980A host = new Agilent34980();
[Guid("000208D5-0000-0000-C000-000000000046")] // Anything
[CoClass(typeof(Foo))]
[ComImport]
public interface IFoo { void Bar(); }

public class Foo : IFoo { public void Bar() { return; } }

void Main()
{
    IFoo instance = new IFoo();
}