C# XNA Xbox, в этом случае необязательные параметры не являются необязательными

По-видимому, необязательные параметры не будут работать в C# Xna при использовании на Xbox, во время компиляции указывается, что они не поддерживаются.

У меня такая ситуация:

func(float? a = null, int? b = null)

При большом количестве этих необязательных параметров, которые по умолчанию имеют «неопределенное» значение, значение null. Эта ситуация обязательна.

В приведенном выше упрощенном примере это можно развернуть, хотя это не разрешено необязательными параметрами:

func()
func(float? a)
func(int? b)
func(float? a, int? b)

Однако при большом количестве параметров это нецелесообразно.

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

Вместо этого я мог бы, и, вероятно, наиболее практично, потребовать все параметры.

func(float? a, int? b)

Затем вызовите так:

func(null, 4)

Где первое не определено.

Есть ли способ включить необязательные параметры в C# XNA на Xbox вместо использования одного из вышеперечисленных вариантов?


person alan2here    schedule 29.02.2012    source источник
comment
Рассматривали ли вы передачу объекта класса вместо 15 параметров, которые могут потребоваться или не потребоваться? Похоже, это решит вашу проблему и даст вам максимальную гибкость.   -  person George Clingerman    schedule 01.03.2012
comment
Мне пришлось бы построить класс, а затем определить некоторые из его параметров, возможно, во многих отдельных строках кода или с помощью конструктора или другой функции-члена, которая сама имела необязательные параметры. Это неплохая идея, не такая хорошая для меня, как необязательные параметры, но отличная по сравнению с решением func(null, 4) с точки зрения отсутствия порядка параметров, которые должны оставаться неизменными.   -  person alan2here    schedule 05.03.2012


Ответы (3)


Я, конечно, запускал на XBOX с необязательными параметрами, но это потребовало некоторой настройки параметров сборки. Насколько я помню, он не будет работать с WP7.

Я думаю, что это могло быть связано с используемой языковой версией.

Проверьте следующие ссылки:

http://msdn.microsoft.com/en-us/library/ff827884.aspx

http://forums.create.msdn.com/forums/p/54007/327944.aspx

person Beanish    schedule 29.02.2012

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

Если типы находятся вне вашего контроля: методы расширения для добавления перегрузок.

person Marc Gravell    schedule 29.02.2012
comment
Сложно там, где моделируется, например, 15 необязательных параметров. - person alan2here; 29.02.2012
comment
В этом случае 32 768 версий функции кажутся излишними. - person alan2here; 29.02.2012
comment
Также было бы неплохо иметь возможность определять в любом порядке при использовании. - person alan2here; 29.02.2012
comment
@alan да, не пишите все 15 тыс., но я подозреваю, что на самом деле используется только подмножество - person Marc Gravell; 29.02.2012
comment
Спасибо, разработка подмножества может быть очень сложной, все равно будет длинным списком и будет меняться в некоторых случаях, когда функция изменялась. Я не собираюсь пробовать это :¬P, но спасибо за отзыв. - person alan2here; 05.03.2012

Я не думаю, что вы можете включить необязательные параметры. Может быть, вы можете использовать альтернативу. как ключевое слово params, которое создает массив, вы можете просто передать объект как параметр

public class MyParams 
{
     public float? a {get;set;}
     public int? b {get;set;}
}

func(new MyParams { b = 5 });

С этим решением у вас есть вся необходимая гибкость. Вы можете добавлять, удалять параметры, не думая о добавлении/удалении новой перегрузки. И если вы удалите или отредактируете параметр, вы получите ошибку времени компиляции, чего вы можете не получить при многократной перегрузке.

person Sauleil    schedule 29.02.2012
comment
Это, вероятно, неприемлемо в игре XNA на Xbox 360, где выделение памяти часто является большим запретом. - person Andrew Russell; 01.03.2012