هل تحذير CS3006 صالح في هذه الحالة؟
-
23-08-2019 - |
سؤال
ينشئ الرمز أدناه تحذير 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 يحدد أن واجهة قد تحدد الأساليب المتضاربة بنفس الاسم أو التوقيع ويجب أن يعرف المحول البرمجي كيفية سرد الفرق - ولكن مرة أخرى، فقط عندما يكون الصراع بين واجهتين.