Я не думаю, что возможно получить тип, когда значение является пустым. Кроме того, так как Вы звоните в GetParameterValue, лучшее, которое Вы могли сделать (когда значение является пустым) должно получить тип "целевого" параметра, который является "объектом". Вы могли бы рассматривать передачу Типа в качестве параметра к GetParameterValue, где у Вас есть больше информации, такой как:
public void GetParameterValue(Type sourceType, out object destination) { //... }
Из MSDN ( http://msdn.microsoft.com/en-us/library/ms228606.aspx )
Константное выражение - это выражение которые можно полностью оценить на время компиляции. Потому что единственный способ создать ненулевое значение ссылочный тип [массив] - применить новый оператор, и поскольку новый оператор не допускается в константное выражение, единственное возможное значение для констант ссылочных типов кроме строки имеет значение null.
Ошибка компилятора точно сообщает вам, почему вы не можете этого сделать:
'arr' имеет тип 'double []'.
Поле const ссылочного типа, отличного от строки, может быть инициализировано только значением null.
Проблема в том, что вы объявляете постоянный массив типа double, а не массив константных чисел типа double. Я не думаю, что есть способ получить массив констант из-за того, как массивы работают в C #.
Вероятно, это потому, что
static const double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
фактически то же самое, что сказать
static const double[] arr = new double[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9};
Значение, присвоенное константе, должно быть ... const. Каждый ссылочный тип не является постоянным, а массив является ссылочным типом.
Решение, которое показало мое исследование, заключалось в использовании статического readonly. Или, в вашем случае с фиксированным количеством двойников, присвойте всему индивидуальный идентификатор.
Edit (2): Небольшой побочный элемент, каждый тип может использоваться как const, но присвоенное ему значение должно быть const. Для ссылочных типов единственное, что вы можете присвоить, - это null:
static const double[] arr = null;
Но это совершенно бесполезно. Строки являются исключением, это также единственный ссылочный тип, который может использоваться для аргументов атрибута.
В C # нет возможности иметь константный массив. Вам необходимо использовать индексаторы, свойства и т. Д., Чтобы гарантировать, что содержимое массива не будет изменено. Возможно, вам придется переоценить публичную сторону вашего класса.
Просто чтобы указать ... Статическое только для чтения -IS NOT CONST-
Это совершенно верно, а не то, что вы хотели:
class TestClass
{
public static readonly string[] q = { "q", "w", "e" };
}
class Program
{
static void Main( string[] args )
{
TestClass.q[ 0 ] = "I am not const";
Console.WriteLine( TestClass.q[ 0 ] );
}
}
Вам нужно будет найти другие способы защиты вашего массива.
Я не знаю, почему вам нужно было сделать его постоянным или только для чтения. Если вы действительно хотите сделать весь массив неизменяемым, то простое ключевое слово constant / readonly вам не поможет, и, что еще хуже, оно также может сбить вас с пути.
Для любых неизменяемых ссылочных типов сделать их только для чтения означает, что вы никогда не сможете повторно назначить переменную саму , но содержимое все еще можно изменить. См. Пример ниже:
readonly double[] a = new double[]{1, 2, 3};
...
a = new double[] {2,3}; // this won't compile;
a[1] = 4; // this will compile, run and result the array to {1, 4, 3}
В зависимости от вашего контекста могут быть некоторые решения, одно из них: если вам действительно нужен список double, List a = new List () {1,2,3,4, 5} .AsReadOnly (); предоставит вам список double.