Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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# VB.NET与C的交叉兼容性#_C#_.net_Vb.net_Interop - Fatal编程技术网

C# VB.NET与C的交叉兼容性#

C# VB.NET与C的交叉兼容性#,c#,.net,vb.net,interop,C#,.net,Vb.net,Interop,我有一个带有通用接口的C#项目 public interface IMyFoo<T> { void DoSomething(T instance); } 怎么了?我可以像这样直接播放,效果很好……但我真的不想这样 DirectCast(bar, IMyFoo(Of MyType1)).DoSomething(instance) 您可能必须: 与仅从单个基类型派生的其他类型不同,接口可以从多个基接口派生。因此,接口可以从不同的基接口继承同名类型成员。在这种情况下,多重继承的名称在派

我有一个带有通用接口的C#项目

public interface IMyFoo<T> { void DoSomething(T instance); }
怎么了?我可以像这样直接播放,效果很好……但我真的不想这样

DirectCast(bar, IMyFoo(Of MyType1)).DoSomething(instance)

您可能必须:


与仅从单个基类型派生的其他类型不同,接口可以从多个基接口派生。因此,接口可以从不同的基接口继承同名类型成员。在这种情况下,多重继承的名称在派生接口中不可用,并且通过派生接口引用任何这些类型成员都会导致编译时错误,而不管签名或重载如何。相反,冲突的类型成员必须通过基接口名称引用。

为了进一步详细说明,VB不直接支持您所做的操作的原因是,您所展示的只是一个类使用相同方法实现两个接口的特例。每当VB看到这一点时,它就会强制强制强制转换,以明确您打算使用哪一个。VB设计人员认为这将减少代码出错的可能性。C#更进一步,假设你知道自己在做什么,并让你打电话。通过使用两个具有相同方法的接口的更通用的情况,可以使C#获得相同的基本错误:

public interface IMyFoo1 { void DoSomething(string instance); }
public interface IMyFoo2 { void DoSomething(string instance); }
public interface IMyBar : IMyFoo1, IMyFoo2 { }
public class MyTestClass : IMyBar
{
    //Explicit interface declaration required
    void IMyFoo1.DoSomething(string instance) { }
    void IMyFoo2.DoSomething(string instance) { }
}

string s = "";
IMyBar bar = new MyTestClass();
bar.DoSomething(s);//The call is ambiguous between the following methods or properties...

MyType1
Type1
Type2
之间的关系有些不明显。gaearon:MyType1和MyType2只是C#项目中定义的不相关的具体类。感谢您的参考。对于微软来说,这真的是一个很糟糕的借口,我希望这不是微软半生不熟实现的又一个无法解决的遗留问题。你引用的那篇文章是2003年写的…7年后,我希望他们能解决这个问题?我想你不会很快看到这个问题得到解决。这是2010年的版本。克里斯是对的,它不是固定的,我相信这一切都是在office中首先被发现的interop@Microsoft当前位置如果有人在读这篇文章:从字面上说,如果我整天生产这些半生不熟的解决方案,我会感到羞愧。
DirectCast(bar, IMyFoo(Of MyType1)).DoSomething(instance)
public interface IMyFoo1 { void DoSomething(string instance); }
public interface IMyFoo2 { void DoSomething(string instance); }
public interface IMyBar : IMyFoo1, IMyFoo2 { }
public class MyTestClass : IMyBar
{
    //Explicit interface declaration required
    void IMyFoo1.DoSomething(string instance) { }
    void IMyFoo2.DoSomething(string instance) { }
}

string s = "";
IMyBar bar = new MyTestClass();
bar.DoSomething(s);//The call is ambiguous between the following methods or properties...