gpt4 book ai didi

c# - 代码契约(Contract)重写失败, 'Could not resolve member reference'

转载 作者:太空狗 更新时间:2023-10-29 20:33:14 24 4
gpt4 key购买 nike

请注意,这可能this question 的副本,我不完全确定。

我的问题是我有一个类库项目,它引用了第三方类型库 (COM)。我想将契约放入类库中的方法中,如下所示:

public class foo
{
public static int divide(TypeFromTypeLib tftl, int a, int b)
{
Contract.Requires<ArgumentException>(b != 0);
return a / b;
}
}

然后让一个客户项目使用这个方法,例如

var n = foo.divide(null, 4, 2);

但我也希望客户项目在其某些方法中也使用契约。因此,我将两个项目的代码契约(Contract)属性都设置为“执行运行时契约(Contract)检查”(否则您会得到运行时断言,告诉您它需要此设置)。

现在,当我尝试编译客户端时,出现以下错误:

Could not resolve member reference: my_class_lib.foo::divide.

ccrewrite : error : Rewrite aborted due to metadata errors.

这似乎是不可避免的 - 任何时候调用具有来自第三方类型库的类型的方法时都会发生这种情况。从方法的签名中删除类型就可以了。

谁能解释为什么会这样?这是表明我的代码结构存在根本性缺陷的线索(如果是,为什么?),还是代码契约的怪癖? 是否有解决此问题的建议?

最佳答案

老实说,我不知道为什么 ccrewrite 有互操作类型的问题,但我可以给你 3 个解决方法:

解决方案一

这是最简单的:

  • 转到项目的引用列表。
  • 寻找第三方类型库。
  • 右击。
  • 从上下文菜单中选择属性
  • 嵌入互操作类型从 True 更改为 False。

您必须为这两个项目执行此操作。此解决方案的缺点是,在构建之后,您将在 bin 文件夹中获得一个额外的互操作程序集。

方案二

另一种解决方案可能是从公共(public)接口(interface)的第三方类型库中删除类型,即:

public class foo
{
public static int divide(int a, int b)
{
return divide(null, a, b);
}

private static int divide(TypeFromTypeLib tftl, int a, int b)
{
Contract.Requires<ArgumentException>(b != 0);
return a / b;
}
}

当然,只有当您不需要在客户端中使用 TypeFromTypeLib 时,您才可以这样做。

方案三

如果您需要在您的客户端中使用 TypeFromTypeLib,您可以为此类编写一个包装器,即:

public class MyTypeFromTypeLib
{
//...
}

public class foo
{
public static int divide(MyTypeFromTypeLib mytftl, int a, int b)
{
var tftl = new TypeFromTypeLib();
//Map MyTypeFromTypeLib to TypeFromTypeLib
//...
return divide(tftl , a, b);
}

private static int divide(TypeFromTypeLib tftl, int a, int b)
{
Contract.Requires<ArgumentException>(b != 0);
return a / b;
}
}

但是,这个解决方案很麻烦,因为需要额外的类。

关于c# - 代码契约(Contract)重写失败, 'Could not resolve member reference',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35369177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com