なぜこれがCLS互換性がありませんか?
-
26-09-2019 - |
質問
私は、次のインタフェースを持っています:
public interface ITemplateItem
{
int Id { get; set; }
String Name { get; set; }
String Text { get; set; }
int CategoryId { get; set; }
int Typ { get; set; }
}
public interface ITemplateCategory
{
int Id { get; set; }
String Name { get; set; }
List<ITemplateItem> TemplateItems { get; set; }
void Add(ITemplateItem item);
void Remove(ITemplateItem item);
ITemplateItem CreateTemplateItem();
}
はITemplateItemの私の実装では、このようになります
public class MyTemplateItem : ITemplateItem
{
#region ITemplateItem Member
public int Id { get; set; }
public String Name { get; set; }
public String Text { get; set; }
public int CategoryId { get; set; }
public int Typ { get; set; }
#endregion
}
しかしITemplateCategory実装のために、コンパイラは、私のクラスは、CLSに準拠していないことを私に伝えます。
public class MyTemplateCategory : ITemplateCategory
{
#region ITemplateCategory Member
public int Id { get; set; }
public String Name { get; set; }
// Warning: type of TemplateItems not CLS-Compliant
public List<ITemplateItem> TemplateItems { get; set; }
// Warning: Argument not CLS-Compliant
public void Add(ITemplateItem item)
{
throw new NotImplementedException();
}
// Warning: Argument not CLS-Compliant
public void Remove(ITemplateItem item)
{
throw new NotImplementedException();
}
// Warning: Return type not CLS-Compliant
public ITemplateItem CreateTemplateItem()
{
throw new NotImplementedException();
}
#endregion
}
[OK]を、
私はこれらの警告を無視するか、私のクラスにCLSCompliant(偽)属性を追加することによって、それらをオフにすることができます。 これがなぜ起こるかしかし、私は好奇心旺盛です。 Expeciallyコンパイラはinferface自体に文句はありませんので。
これは、一般的にインターフェースを公開したり、私はちょうど禁断のキーワードを使用しなかったクラスのために発生しますか?
解決
これらは万が一異なるアセンブリにありますか? ITemplateItem
はCLSCompliantであることを主張しないアセンブリでますか? I のそれを説明するだろうというのだと思う - ちょうどそのアセンブリCLSCompliant作り、その場合には - 。または可能性だけでも、ITemplateItem
所属していません StackOverflow