Что это за звездочки, когда я создаю конструктор с 2D-массивами в качестве параметров в Visual Studio?

Если бы в Visual Studio для Mac я написал что-то вроде этого:

public class Foo {
    public int[,] Property1 { get; }

}

Поместите курсор на пустую строку и нажмите Command + I, чтобы сгенерировать конструктор:

введите описание изображения здесь

А бывает такое:

public class Foo {
    public int[,] Property1 { get; }
    public Foo(int[*, *] property1)
    {
        Property1 = property1;
    }
}

Конструктор сгенерирован, но тип параметра - int[*, *], который не компилируется.

введите описание изображения здесь

Я думаю, что это Visual Studio предлагает мне написать что-нибудь, чтобы заменить эти звездочки, а может и нет? Поскольку этого не происходит с одномерными массивами, и я не знаю никакого синтаксиса в C #, который позволяет вам помещать материал в [] в таком месте.

Для трехмерного массива он генерирует 3 звездочки:

public Foo(int[*, *, *] property1)
{
    Property1 = property1;
}

Что заставляет Visual Studio делать это?

Моя версия Visual Studio: Visual Studio для Mac Community 7.2.2 (сборка 11).

Я попытался протестировать это в версии Visual Studio для Windows - Visual Studio Community 2015. Но мне не удалось найти кнопку, которая делает это. Согласно этому ответу, в «быстрых действиях» есть кнопка конструктора создания, но я не нашел ни одного. Может дело не в версии Сообщества?


person Sweeper    schedule 24.02.2018    source источник
comment
Я не могу вспомнить, когда в последний раз видел, как кто-то использовал зубчатый массив   -  person johnny 5    schedule 02.05.2018
comment
@bommelding, черт возьми, это было так давно, что я даже не помню название этой функции   -  person johnny 5    schedule 02.05.2018


Ответы (2)


    int[*, *] property1

Это вызвано ошибкой Visual Studio. Странно выглядящий синтаксис соответствует внешнему виду несоответствующего массива. Массив является совместимым, и его синтаксис поддерживается C #, когда его нижняя граница равна 0. В C # нет синтаксиса, доступного для типов массивов, которые не соответствуют, таким образом, странность [*,*] и ошибки компиляции, которые он генерирует.

Обычно это происходит только в C #, когда вы взаимодействуете с системой сторонних типов, которая способна создавать такие типы массивов. Я знаю COM только как практический пример, способный выдавать информацию о типе, которая может быть напрямую использована программой C #. Обратите внимание на совпадение синтаксиса в этом существующем вопросе, другом здесь.

Но, конечно, тип вашей собственности не особенный. VS теряет свои шарики в коде Roslyn, интегрированном в IDE. Команда, которая работает над этим, не имеет хорошей репутации в написании проверенного кода без ошибок. Я сам не могу получить репро для этого, у меня версия 15.5.6, и я избегал обновления до 15.6.x из-за большого количества созданных отчетов об ошибках. Незначительные шансы, что это специфично для версии Mac, ОС имеет вызов COM. VS2015 еще не имел этой функции, поэтому вы не можете ее найти, ReSharper - популярная коммерческая альтернатива.

Внутри VS используйте «Справка»> «Отправить отзыв»> «Сообщить о проблеме», чтобы сообщить им об ошибке. Я не вижу существующего отчета об этом дефекте, по крайней мере, при поиске на сайте developercommunity.visualstudio.com по запросу "создать конструктор". Я не ожидаю, что многие программисты столкнутся с этой ошибкой или найдут время, чтобы сообщить о ней. Решение простое, просто отредактируйте код на int[,] property1.

person Hans Passant    schedule 02.05.2018

Я не уверен, почему VS for Mac помещает туда эти звездочки, но я думаю, вы хотите их удалить. Возможно, это ошибка в VS. У меня работает следующий код.

public class Foo
{
    public int[,] Property1 { get; }
    public Foo(int[,] property1)
    {
        Property1 = property1;
    }
}

var myArray = new int[,] { { 1, 2 }, { 3, 4 } };
var foo = new Foo(myArray);
person asherber    schedule 24.02.2018