wpf DependencyProperty Не принимает значение по умолчанию для краткости

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

Если я попытаюсь присвоить ему значение null в качестве значения по умолчанию, оно сработает, даже если это не нулевой тип. Как это происходит..

public short MyProperty
{
   get { return (short)GetValue(MyPropertyProperty); }
   set { SetValue(MyPropertyProperty, value); }
}

Использование DependencyProperty в качестве резервного хранилища для MyProperty. Это включает анимацию, стилизацию, привязку и т. д.

public static readonly DependencyProperty MyPropertyProperty =
    DependencyProperty.Register(
        "MyProperty",
        typeof(short),
        typeof(Window2),
        new UIPropertyMetadata(0)
    );

person biju    schedule 16.04.2010    source источник


Ответы (2)


Проблема в том, что компилятор C# интерпретирует литеральные значения как целые числа. Вы можете сказать, чтобы он анализировал их как длинные или улонги (40L — это длинный, 40UL — это улонг), но нет простого способа объявить короткий.

Простое приведение литерала будет работать:

public short MyProperty
{
    get { return (short)GetValue(MyPropertyProperty); }
    set { SetValue(MyPropertyProperty, value); }
}

public static readonly DependencyProperty MyPropertyProperty = 
   DependencyProperty.Register(
      "MyProperty", 
      typeof(short),
      typeof(Window2),
      new UIPropertyMetadata((short)0)
   );
person Abe Heidebrecht    schedule 16.04.2010

public short MyProperty
{
    get { return (short)GetValue(MyPropertyProperty); }
    set { SetValue(MyPropertyProperty, value); }
}


// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MyPropertyProperty =
            DependencyProperty.Register("MyProperty", typeof(short), typeof(Window2), new UIPropertyMetadata((short)0));
     }

Кажется, это работает... похоже, 0 будет интерпретироваться как int... но почему...?

person biju    schedule 16.04.2010
comment
Конструктор UIPropertyMetadata получает параметр объекта, поэтому преобразования нет. Спецификация C# говорит, что целочисленные литералы используются для записи значений типов int, uint, long и ulong. Когда вы пишете 0 без приведения, вы получаете целое число. - person majocha; 16.04.2010
comment
Не отвечайте на свой вопрос. Обновите его. - person ; 16.04.2010
comment
@Will Если я обновлю свой вопрос, то это больше не будет вопросом ... тогда как это принесет пользу другим людям с такими же проблемами ... - person biju; 16.04.2010
comment
Вы можете сами отвечать на свои вопросы, см. FAQ. - person Wallstreet Programmer; 16.04.2010
comment
@biju ты не ответил на него, ты обновил свой вопрос. похоже, что 0 будет интерпретироваться как int, но почему? Это означает, что вы обновляете свой вопрос дополнительной информацией, а не даете всем ответ. Кроме того, не могли бы вы отредактировать этот ответ и исправить форматирование? В ФС все хреново... - person ; 16.04.2010
comment
@ Будет хорошо, я не ответил на свой вопрос. Я опубликовал обходной путь ... и я задал вопрос, чтобы обсуждение оставалось открытым ... и, как вы видите, я получил ответ, который искал. просто отвернись... зачем беспокоиться...? - person biju; 20.04.2010
comment
@biju хорошо, я солгал. Это просто одна из тех раздражающих вещей, которые делают нубы. Например, неспособность правильно отформатировать свои вопросы и ответы. У вас все еще есть код, который все испортил. - person ; 21.04.2010
comment
@ Уилл..Спасибо, но на вопрос уже дан ответ..Вопрос новичка с испорченным кодом привлек внимание некоторых гиков, и знаете что, я получил то, что искал..В любом случае спасибо за внимание.. - person biju; 21.04.2010