Подтвердить что ты не робот

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

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

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

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

Итак, теперь я смущен, есть ли "Необязательные параметры" CLS-совместимый или нет?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Если это так, я считаю, что они 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());
        }
    }
}

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

Ответ 3

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

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

Но ящик справа внизу говорит:

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