C# 对具有重写属性的重载函数的调用不明确

C# 对具有重写属性的重载函数的调用不明确,c#,.net,c++-cli,C#,.net,C++ Cli,我有两个基本接口 interface IHasId { int Id {get;} // readonly } interface IEntity : IHasId { new int Id {get; set;} // must be able to assign Ids } 然后有几个实体实现了智能性 interface IThing : IEntity { // thing specific stuff } 这些实体同时在C#和C++/Cli中使用。这一切都很

我有两个基本接口

interface IHasId
{
    int Id {get;} // readonly 
}

interface IEntity : IHasId
{
    new int Id {get; set;} // must be able to assign Ids
}
然后有几个实体实现了智能性

interface IThing : IEntity
{
   // thing specific stuff
}
这些实体同时在C#和C++/Cli中使用。这一切都很好,直到我搬到VS2015

现在,当我尝试访问C++中的ID < /p>

void SomeFunction(IThing^ thing)
{ 
    DoSomething(thing->Id);
}
我得到以下错误:

error C2668: 'IHasId::Id::get': ambiguous call to overloaded function
1>  file.cpp(52): note: could be 'int IHasId::Id::get(void)'
1>  file.cpp(52): note: or       'int IEntity::Id::get(void)'
我可以通过将代码更改为

void SomeFunction(IThing^ thing)
{ 
    IHasId x = thing;
    DoSomething(x->Id);
}

但转换所有现有代码是一项艰巨的任务。这在2010年表现良好。有人有什么建议吗?

您能将此代码复制到一个非常简单的项目中,并确认它仍然不起作用吗?在你的例子中,它被破坏了,你没有触及到接口,所以我认为在你的项目中还有其他代码以某种方式将这些接口联系在一起。你所展示的似乎不可能

您能否将此代码复制到一个非常简单的项目中,并确认它仍然不起作用?在你的例子中,它被破坏了,你没有触及到接口,所以我认为在你的项目中还有其他代码以某种方式将这些接口联系在一起。你所展示的似乎不可能

不,这在VS2015中起作用,就像往常一样。您的代码片段是假的,它们永远无法演示问题,因为接口不是公共的。发布真实代码。我在下面的一个简单项目中重现了这个问题。这些代码片段说明了这个问题,而真正的代码是一个超过100万LOC的项目的一部分。不,这在VS2015中就像往常一样有效。您的代码片段是假的,它们永远无法演示问题,因为接口不是公共的。发布真实代码。我在下面的一个简单项目中重现了这个问题。这些代码片段说明了这个问题,而真正的代码是一个超过100万LOC的项目的一部分。试图将问题简化为最简单的形式。我已经在这里解决了这个问题。现在来看,我认为这可能与框架版本有关。您需要取消对cpplib.cpp中的行的注释以查看错误。此外,如果您将平台工具集从2015年更改为2010年,当我尝试在csharp中运行您的代码并创建一个实现它的类时,错误就会消失,因为它表示我必须从易感性和IHasId。使用new似乎不会覆盖继承接口中的字段。我不是c-sharp内部的专家,因此需要有更多mojo的人来解释原因。你也可以参考这篇文章,根据这些人的说法,新操作符不会覆盖继承接口中的字段。这意味着两者都必须实施。如果你在实际项目中实现这两个项目,那么你需要限定你想在C++项目中消费哪个ID字段。OPPS,是的,IThing应该继承IEntity。试图将问题简化为最简单的形式。我已经在这里解决了这个问题。现在来看,我认为这可能与框架版本有关。您需要取消对cpplib.cpp中的行的注释以查看错误。此外,如果您将平台工具集从2015年更改为2010年,当我尝试在csharp中运行您的代码并创建一个实现它的类时,错误就会消失,因为它表示我必须从易感性和IHasId。使用new似乎不会覆盖继承接口中的字段。我不是c-sharp内部的专家,因此需要有更多mojo的人来解释原因。你也可以参考这篇文章,根据这些人的说法,新操作符不会覆盖继承接口中的字段。这意味着两者都必须实施。如果在实际项目中实现这两个,则需要在C++项目中限定您希望使用哪个ID字段。