在抽象方法中使用non-cls兼容类型

问题描述:

我有一个我使用的外部程序集,并且出于任何原因它没有指定CLS合规性。所以,这会导致我的很多代码被标记为非cls兼容。我遇到的问题如下:在抽象方法中使用non-cls兼容类型

public abstract class SomeClass 
{ 
    //Compiler Error CS3011 
    [CLSCompliant(false)] 
    public abstract object SomeMethod(ExternalNonCompliantType arg); 
} 

public abstract class SomeClass 
{ 
    //Argument type 'External.ExternalNonCompliantType' is not CLS-compliant 
    public abstract object SomeMethod(ExternalNonCompliantType arg); 
} 

CS3011:

类成员不能既是抽象的,不符合 公共语言规范(CLS)。 CLS规定所有 级别的成员应执行。

我真的不知道在这里做什么?

  • 什么是预期的使用,你正在写的代码?
  • 你能把你的整个装配件作为[CLSComplaint(false)]吗?

如果你的程序集也不符合,那么你应该可以使用这种类型的代码。您也可以尝试将一个类标记为不符合标准。我一直标记整个组件。

如果这只是您的代码,并且您没有将其作为库分发,那么这不应该成为问题,您也不必担心CLS遵从性问题。

一个例外是,如果你正在编写内部的东西,你希望能够在各种其他CLR语言如F#,vb.net,ironpython,boo,M,scala等中重用。那就是可能并非如此;大多数应用程序只是 - 应用程序。

+0

问题不在于“我的代码是否应该符合CLS?” – Jodrell 2012-07-19 10:12:49

+1

我正在编写一个我计划分发的库,并且我希望我的库符合CLS标准。我会赞成,因为将整个班级标记为不符合要求的建议会使警告消失,这是有道理的。我只是希望有更好的方法。 – 2012-07-19 10:14:07

+0

如果你正在写一个图书馆,那么是的,我认为它很重要:)大多数人不。实际上,如果预期的消费者使用相同的语言(c#),那么使用它就不会有问题,但对于任何下线的人员都必须标记为非cls兼容,这并不好。 – 2012-08-10 02:50:20