次のインターフェイスがあります。
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(false) 属性を追加して無効にすることができます。しかし、私はなぜこれが起こるのか興味があります。特に、コンパイラはインターフェイス自体について文句を言わないためです。
これは、一般にインターフェイスを公開するクラスで発生しますか、それとも禁止されたキーワードを使用しただけですか?