Новая особенность C # 4.0 - «Дополнительные параметры» CLS-совместимые?
-
12-11-2019 - |
Вопрос
Эта новая функция действительно удобна.
В последнее время я прочитал документ «Microsoft All-In-One Code Framework», и упоминается, что «необязательные параметры» не совместится с CLS.
Итак, я проверил его с помощью «Дополнительные параметры» в общественном API, и включил FXCOP, то я составлен, и FXCOP не жаловался на что угодно.В то время как FXCOP сообщил о предупреждении, когда добавляю API, который имеет UINT в качестве его возврата.
Так что теперь я запутался, это "необязательные параметры" CLS-совместимые или нет?
И какой лучший способ узнать, является ли функция нового языка CLS-совместимой или нет?
Решение
Дополнительные аргументы - «Срок службы» CLS-совместимого. Методы с дополнительными аргументами являются юридическими и могут быть успешно скомпилированы с атрибутом CLSCompliant
, , но абоненты , но абоненты этих методов не обязательно нужно учитывать значения параметра по умолчанию или дополнительный атрибут. (В этом случае эти методы будут вести себя точно так же, как стандартные методы, требующие, чтобы все аргументы были указаны явно на участке вызова.)
Методы, которые используют параметры по умолчанию разрешены под общим языком Спецификация (CLS); Тем не менее, CLS позволяет компиляторам игнорировать значения которые назначены на эти параметры. Код, который написан для компиляторов которые игнорируют значения параметров по умолчанию должен явно предоставлять аргументы для каждый параметр по умолчанию. Поддерживать поведение, которое вы хотите по всему языки программирования, методы, которые Используйте параметры по умолчанию должны быть заменен методом перегрузки, которые Укажите параметры по умолчанию.
(взято из документации для "CA1026: параметры по умолчанию не должны использоваться" . )
Другие советы
Я интерпретирую ваш вопрос о Дополнительные аргументы .
Если так, то я полагаю, что они являются совместимыми CLS, и вы можете проверить, используя
.
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());
}
}
}
Это компилирует без предупреждений.
Посмотрите на cls specs .
С стр. 41:
Ограничение Vararg может быть включено, чтобы указать, что все аргументы прошлые эта точка являются необязательными.Когда Похоже, что конвенция о вызове должна быть одной, которая поддерживает переменные списки аргументов.
Но коробка прямо внизу говорит:
cls Правило 15: ограничение Vararg не является частью CLS, а только конвенция о вызовах, поддерживаемой CLS - это стандартная управляемая конвенция о вызове