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