Совместима ли новая функция C # 4.0 - необязательные параметры с CLS?

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

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

Поэтому я протестировал его, используя «Дополнительные параметры» в общедоступном API, и включил FxCop, затем я скомпилировал, и FxCop ни на что не жаловался. Между тем, FxCop сообщал о предупреждении, когда я добавляю API, для которого в качестве возвращаемого типа используется uint.

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

И как лучше всего узнать, совместима ли новая языковая функция с CLS?


person Cui Pengfei 崔鹏飞    schedule 28.03.2011    source источник
comment
Я считаю, что правильным тестом было бы установить CLSCompliantAttribute и проверьте, будет ли он компилироваться.   -  person Snowbear    schedule 28.03.2011
comment
о, да. Я пробовал это и забыл упомянуть, извините. это скомпилировано.   -  person Cui Pengfei 崔鹏飞    schedule 28.03.2011


Ответы (3)


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

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

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

person LukeH    schedule 28.03.2011
comment
Спасибо, тогда я предполагаю, что то, что они сказали в документе, неверно, верно? Вот что они сказали: используйте перегрузку элементов, а не определяйте элементы с аргументами по умолчанию. Аргументы по умолчанию несовместимы с CLS и не могут использоваться на некоторых языках. Это документ: 1code.codeplex.com/releases/view/62267#DownloadId = 215635 Просто не думал, что документ полуофициального проекта может ошибаться. - person Cui Pengfei 崔鹏飞; 29.03.2011
comment
Строго говоря, аргументы по умолчанию несовместимы, но совершенно законно создать метод с параметрами по умолчанию, и этот метод будет совместим с CLS. Но это не означает, что другие CLS-совместимые языки вынуждены уважать указанные вами необязательные атрибуты и значения по умолчанию. Если вы хотите быть уверены, что пользователи вашего кода (на любом языке) могут опустить аргументы и вернуться к значениям по умолчанию, которые вы выбрали, тогда вам следует использовать перегрузку, а не параметры по умолчанию. - person LukeH; 29.03.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());
        }
    }
}

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

person David Heffernan    schedule 28.03.2011
comment
Они вроде как CLS-совместимые: они разрешены, но CLS-совместимому языку разрешено игнорировать значения по умолчанию и необязательный атрибут и просто рассматривать их как обычные параметры. Подробности смотрите в моем ответе. - person LukeH; 28.03.2011
comment
@LukeH Спасибо. Возможно, нам нужно уметь писать CLSCompliant(sort-of) ;-) - person David Heffernan; 28.03.2011

Ознакомьтесь с спецификациями CLS. < br> Со страницы 41:

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

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

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

person weismat    schedule 28.03.2011
comment
Обратите внимание, что varargs - это другой зверь, чем то, что предлагал OP. Varargs, по сути, касается ключевого слова params в C #, тогда как вопрос OP касался значений по умолчанию для параметров (например, в void Func(int p = 42)). - person Christian.K; 28.03.2011
comment
@CuiPengFei: OP означает оригинальный плакат - это ты. См. meta.stackexchange.com/questions/15165/what-does-op-mean - person Gabe; 29.03.2011