【问题标题】:How can an Object implement an interface and the 'is' operator return false? [closed]对象如何实现接口并且“is”运算符返回false? [关闭]
【发布时间】:2022-01-23 05:17:23
【问题描述】:

我有一个事件处理程序,其中:

public void Handle (object sender, object[] parameters)

在处理程序中我有一些代码:

var _view = sender as ISomeInterface;

if(_view != null) { ... do stuff }

然而,尽管sender 是实现ISomeInterface 的类型,但条件失败。

更奇怪的是我的调试器显示的内容:

typeof(ISomeInterface).AssemblyQualifiedName
  When evaluated, the debugger shows:
My.Company.ISomeInterface, MyCompany.Common, Version=1.0.8025.23774, Culture=neutral, PublicKeyToken=null

根据调试器也是如此:

sender.GetType().GetInterfaces()[4].AssemblyQualifiedName
  When evaluated, the debugger shows:
My.Company.ISomeInterface, MyCompany.Common, Version=1.0.8025.23774, Culture=neutral, PublicKeyToken=null

然而,当我评估sender is ISomeInterface 时,它返回false。谁能帮我理解这怎么可能?

编辑#1

在从版本控制中签出后,同事的机器上也会发生同样的奇怪行为,所以不仅仅是我的机器/操作系统/软件有某种问题。

【问题讨论】:

标签: c#


【解决方案1】:

Visual Studio 似乎以某种方式从 2 个不同的位置加载相同的 dll(如何或为什么仍有待确定),但如果您遇到这种情况,请将其放入调试器中以检查 dll 源是否相同:

typeof(ISomeInterface).Assembly.Location
sender.GetType().GetInterfaces()[4].Assembly.Location

就我而言,有 2 个不同的位置。 dll 的版本相同,但 dotNet 显然不允许以这种方式使用来自不同 dll(即使它们相同)的类型。

【讨论】:

  • 您所描述的是GSerg链接的问题的答案之一。此问题应作为副本关闭。
  • @julealgon 公平地说,它隐藏在该页面上的其他十几个答案中。
  • @Dai 确实如此。我赞成它,因为它似乎是一个足够普遍的案例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多