سؤال

ينشئ الرمز أدناه تحذير CS3006 "طريقة مثقلة namnamespace.sample.mymethod (int [])" مختلفة فقط في المرجع أو خارج، أو في رتبة الصفيف، ليس متوافقا مع CLS ".

هل هذا تحذير صالح، أي هذا هو حقا غير متوافق CLS؟ كنت أعتقد أن تنفيذ واجهة صريحة لن يحسب كحملات زائدة.

[assembly: CLSCompliant(true)]
namespace MyNamespace
{

    public class Sample : ISample
    {
        public void MyMethod(int[] array)
        {
            return;
        }

        void ISample.MyMethod(ref int[] array)
        {
            this.MyMethod(array);
        }
    }

    public interface ISample
    {
        void MyMethod([In] ref int[] array);
    }
}
هل كانت مفيدة؟

المحلول

ينطبق الامتثال CLS فقط على الجزء المرئي من صفك. لذلك، كنت تعتقد أن ref int[] ليس public وبالتالي غير مناسب. لكنه مرئي، من خلال الواجهة.

مستخدمي التعليمات البرمجية يعرفون ذلك Sample تقدم void MyMethod(int[]). وبعد وهم يعرفون أيضا أنها تنفذ ISample الذي يقدم void MyMethod(ref int[]). وبعد لذلك، أعتقد أنه في الواقع لا يتوافق CLS.


تعديل: اريك ليبيرت علق على السؤال الأصلي أنه يعتقد أن هذا هو في الواقع خطأ مترجم وأن الرمز الأصلي متوافق مع CLS.


هذا، ومع ذلك، هو صالح:

[assembly: CLSCompliant(true)]
namespace MyNamespace
{
    public class Sample : ISample, ISample2
    {
        void ISample.MyMethod(ref int[] array)
        {
        }

        void ISample2.MyMethod(int[] array)
        {
        }
    }

    public interface ISample
    {
        void MyMethod(ref int[] array);
    }

    public interface ISample2
    {
        void MyMethod(int[] array);
    }
}

وذلك لأن CLS يحدد أن واجهة قد تحدد الأساليب المتضاربة بنفس الاسم أو التوقيع ويجب أن يعرف المحول البرمجي كيفية سرد الفرق - ولكن مرة أخرى، فقط عندما يكون الصراع بين واجهتين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top