【问题标题】:Why is this parameter not CLS-compliant?为什么此参数不符合 CLS?
【发布时间】:2013-10-09 16:00:27
【问题描述】:

我正在尝试消除我们在整个解决方案中遇到的所有符合 CLS 的错误。虽然我已经设法整理了几个(例如,以下划线开头并使用无符号整数的公共变量),但我似乎无法找到它们失败的原因。

我已经粘贴了与其中一个问题相关的所有代码,有相当多的代码,但它只包含一个表单构造函数、接口和实现该接口的类。

VB.Net 表单构造函数(警告在unitOfWork 参数上,并读取参数'unitOfWork'的类型不符合CLS

Public Sub New(ByRef unitOfWork As IUnitOfWork)

    MyBase.New()
    InitializeComponent()

    _unitOfWork = unitOfWork

End Sub

接口IUnitOfWork如下:

public interface IUnitOfWork : IDisposable
{
    bool IsInTransaction { get; }

    bool IsDirty { get; }

    object BeginTransaction();

    object BeginTransaction(IsolationLevel isolationLevel);

    void Commit();

    void Rollback();

    object Session { get; }
}

接口的唯一实现(因此将传递给表单构造函数的实例)是这样的:

public class UnitOfWork : IUnitOfWork
{
    private ISession _session;

    public UnitOfWork(SMSession session)
    {
        if (session == null)
        {
            throw new ArgumentNullException("Session wasn't supplied");
        }

        this._session = (ISession)session.OpenSession();
    }

    public bool IsInTransaction
    {
        get { return this._session.Transaction.IsActive; }
    }

    public bool IsDirty
    {
        get { return this._session.IsDirty(); }
    }

    public object Session
    {
        get { return this._session; }
    }

    public object BeginTransaction() 
    {
        return this._session.BeginTransaction(IsolationLevel.ReadCommitted);
    }

    public object BeginTransaction(IsolationLevel isolationLevel) 
    {
        return this._session.BeginTransaction(isolationLevel);
    }

    public void Commit()
    {
        if (this._session.Transaction == null)
        {
            throw new NullReferenceException
                ("The Transaction has not been initialised");
        }

        this._session.Transaction.Commit();
    }

    public void Rollback()
    {
        if (this._session.Transaction == null)
        {
            throw new NullReferenceException
                ("The Transaction has not been initialised");
        }

        this._session.Transaction.Rollback();
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                this._session.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        if (this._session != null)
        {
            this._session.Dispose();
        }

        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

我要么对这个问题视而不见(可能是这种情况,因为我已经盯着这个问题很久了!)或者还有另一个我不知道的 CLS 合规限制。有什么建议吗?

【问题讨论】:

  • _unitOfWork 变量private 还是另一种可访问性?当我在 C# 中遇到类似问题时,这是因为我有一个以 _ 开头的 protected 变量。 CLS 不允许在暴露给其他类的名称中使用前导下划线。
  • 暴力破解方法:尝试注释掉界面中的方法,看看是否会使警告消失?
  • 我无法使用您发布的代码重现警告
  • @AakashM IUnitOfWork 不会碰那些
  • 声明IUnitOfWork的程序集是否标记为符合CLS?

标签: c# vb.net cls-compliant


【解决方案1】:

我的猜测是你的 C# 库本身没有用 CLSCompliant 标记。我只是复制了错误,VB 项目标记为 CLSCompliant,而它引用的 C# 库没有标记为 CLSCompliant。

我标记了 C# 库 CLSCompliant,警告消失了。

【讨论】:

  • 是的,我们做到了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多