2013-04-01 5 views
7

Это действительно меня озадачивает. Я пытался удалить readonly, меняя имена .. Что я делаю неправильно здесь?Почему мой класс не совместим с CLS?

public abstract class CatalogBase<T> where T : class 
{ 
    protected readonly String DataPath; 
    protected readonly XmlSerializer Serializer; 
    private readonly XmlSerializerNamespaces _namespaces; 

    protected CatalogBase(String dataPath) 
    { 
     DataPath = dataPath; 
     Serializer = new XmlSerializer(typeof (T)); 
     _namespaces = new XmlSerializerNamespaces(); 
     _namespaces.Add(String.Empty, String.Empty); 
    } 

    public virtual void Write(T obj) 
    { 
     var streamWriter = new StreamWriter(DataPath); 

     Serializer.Serialize(streamWriter, obj, _namespaces); 
     streamWriter.Close(); 
    } 

    public abstract IDictionary<String, T> Read(); 
} 

Edit:

Предупреждение:

Warning 1 'Ar.ViewModel.Workspaces.MaterialCatalogBase': base type 'Or.Files.CatalogBase' is not CLS-compliant C:_Center_Work_Programming_Cs\Ar\Ar\ViewModel\Workspaces\MaterialCatalogBase.cs 9 18 Ar

Edit2:

Даже если я изменить класс, как показано ниже, я все еще получаю ошибку:

public abstract class CatalogBase<T> where T : class 
{ 
    protected readonly String DataPath; 
    protected readonly XmlSerializer Serializer; 
    private readonly XmlSerializerNamespaces namespaces; 

    protected CatalogBase(String dataPath) 
    { 
     DataPath = dataPath; 
     Serializer = new XmlSerializer(typeof (T)); 
     namespaces = new XmlSerializerNamespaces(); 
     namespaces.Add(String.Empty, String.Empty); 
    } 

    public virtual void Write(T obj) 
    { 
     var streamWriter = new StreamWriter(DataPath); 

     Serializer.Serialize(streamWriter, obj, namespaces); 
     streamWriter.Close(); 
    } 

    public abstract IDictionary<String, T> Read(); 
} 

Кроме того, я забыл упомянуть, что по какой-то причине я получаю две (точно такие же ошибки) ..?

+1

Что такое точное предупреждения вы прием? –

+0

Мы не компиляторы, поэтому, пожалуйста, покажите, где вы получите предупреждение компиляции CLS. – CodeCaster

+1

Я не получаю предупреждение, когда компилирую это, все выглядит нормально. –

ответ

4

Похоже, у вас есть следующие:

  • Сборка A объявляет CatalogBase<T>. Сборка A не обозначен как CLSCompliant
  • сборка сборных сборок A. Монтаж B объявляет MaterialCatalogBase : CatalogBase<T>. Монтаж В является помечена как CLSCompliant

Если это ваш случай - то сборка, в которой ваш CatalogBase<T> класс расположен, должен быть помечен атрибутом CLSCompliant:

[assembly: CLSCompliant(true)]