Является ли новая функция C # 4.0 - «Необязательные параметры» CLS-совместимой? - PullRequest
30 голосов
/ 28 марта 2011

Эта новая функция действительно удобна.

В последнее время я прочитал документ "Microsoft All-In-One Code Framework" и упомянул, что "Необязательные параметры" не совместимы с CLS.

Итак, я протестировал его с помощью «Необязательных параметров» в открытом API и включил FxCop, затем скомпилировал и FxCop ни на что не жаловался.В то же время FxCop действительно сообщал о предупреждении, когда я добавлял API, у которого в качестве типа возврата используется uint.

Так что теперь я в замешательстве, CLS-совместим ли "Необязательные параметры" или нет?

И какой лучший способ выяснить, совместима ли CLS-совместимость нового языка или нет?

Ответы [ 3 ]

25 голосов
/ 28 марта 2011

Необязательные аргументы являются "сортировочными" CLS-совместимыми. Методы с необязательными аргументами являются допустимыми и могут быть успешно скомпилированы с атрибутом CLSCompliant, , но для вызывающих этих методов не обязательно учитывать значения параметров по умолчанию или необязательный атрибут. (В этом случае эти методы будут вести себя точно так же, как и стандартные методы, требуя, чтобы все аргументы были явно указаны на сайте вызова.)

Методы, которые используют параметры по умолчанию разрешены под общим языком Спецификация (CLS); Тем не менее, CLS позволяет компиляторам игнорировать значения которые назначены на эти параметры. Код, который написан для компиляторов которые игнорируют значения параметров по умолчанию должны явно предоставить аргументы для каждый параметр по умолчанию. Поддерживать поведение, которое вы хотите через языки программирования, методы, которые использовать параметры по умолчанию должно быть заменены перегрузками методов, которые укажите параметры по умолчанию.

(взято из документации для "CA1026: Не следует использовать параметры по умолчанию" .)

8 голосов
/ 28 марта 2011

Я интерпретирую ваш вопрос как о Необязательные аргументы .

Если это так, то я считаю, что они совместимы с CLS, и вы можете проверить, используя атрибут CLSCompliant :

using System;

[assembly: CLSCompliant(true)]

namespace ConsoleApplication1
{
    public class Program
    {
        public static int Test(int val=42)
        {
            return val;
        }

        static void Main(string[] args)
        {
            System.Console.WriteLine(Test());
        }
    }
}

Это компилируется без предупреждений.

0 голосов
/ 28 марта 2011

Посмотрите спецификации CLS .
Со страницы 41:

Ограничение vararg может быть включено, чтобы указать, что все аргументы после этой точки являются необязательными.Когда оно появляется, соглашение о вызовах должно соответствовать соглашению, которое поддерживает списки переменных аргументов.

Но в поле справа ниже указано:

CLS Правило 15: ограничение varargчасть CLS, и единственное соглашение о вызовах, поддерживаемое CLS, - это стандартное соглашение об управляемых вызовах

...