Небезопасное приведение типов
От: Visor2004  
Дата: 26.04.11 13:01
Оценка:
Не могу написать вот так:

    
    private ConnectToPropertyChanged ( property : string, dataContext : object ) : void
    {
      def propertyChanged = dataContext : INotifyPropertyChanged;
    }


ругаеццо двоеточие в объявлении переменных.

expected System.ComponentModel.INotifyPropertyChanged, got object in type-enforced expression: System.Object is not a subtype of System.ComponentModel.INotifyPropertyChanged [simple require]


Что не так?
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re: Небезопасное приведение типов
От: Jack128  
Дата: 26.04.11 13:06
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Не могу написать вот так:


V>
    
V>    private ConnectToPropertyChanged ( property : string, dataContext : object ) : void
V>    {
V>      def propertyChanged = dataContext : INotifyPropertyChanged;
V>    }

V>


V>ругаеццо двоеточие в объявлении переменных.


V>

V>expected System.ComponentModel.INotifyPropertyChanged, got object in type-enforced expression: System.Object is not a subtype of System.ComponentModel.INotifyPropertyChanged [simple require]


V>Что не так?


двоеточие это уточнение типа, хинт компилятору, примерно как приведение типов в таком c# коде:

var x = (object)(new List<int>());


если те нужно небезопасное приведение типов с проверкой в рантайм, то нужно использовать оператор :>
Re[2]: Небезопасное приведение типов
От: Visor2004  
Дата: 26.04.11 13:21
Оценка:
Здравствуйте, Jack128, Вы писали:

J>если те нужно небезопасное приведение типов с проверкой в рантайм, то нужно использовать оператор :>


Я не хочу писать обработку для InvalidCastException
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[3]: Небезопасное приведение типов
От: Jack128  
Дата: 26.04.11 13:23
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, Jack128, Вы писали:


J>>если те нужно небезопасное приведение типов с проверкой в рантайм, то нужно использовать оператор :>


V>Я не хочу писать обработку для InvalidCastException


а чего хочешь?
Re[4]: Небезопасное приведение типов
От: Visor2004  
Дата: 26.04.11 13:27
Оценка:
Здравствуйте, Jack128, Вы писали:

J>а чего хочешь?


получить null в переменной в случае несовместимости типов
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re: Небезопасное приведение типов
От: Visor2004  
Дата: 26.04.11 13:35
Оценка:
Здравствуйте, Visor2004, Вы писали:

короче, говоря по русски, мне надо аналог "as" из C#
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[5]: Небезопасное приведение типов
От: Jack128  
Дата: 26.04.11 13:36
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, Jack128, Вы писали:


J>>а чего хочешь?


V>получить null в переменной в случае несовместимости типов


аналог as шарповского?? AFAIK — такого оператора нету, мибо макросом добавь, либо по месту


def propertyChanged = match (dataContext) { | x is INotifyPropertyChanged => x; | _ => null }
Re[5]: Небезопасное приведение типов
От: hardcase Пират http://nemerle.org
Дата: 26.04.11 13:38
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, Jack128, Вы писали:


J>>а чего хочешь?


V>получить null в переменной в случае несовместимости типов


На самом деле это неудачная практика, которую навязывает as-выражение C#.

def propertyChanged = match(dataContext)
{
  | x is INotifyPropertyChanged => x
  | _ => null
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Небезопасное приведение типов
От: Ziaw Россия  
Дата: 26.04.11 13:38
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>получить null в переменной в случае несовместимости типов


К своему стыду не знаю, есть ли в Nemerle аналог оператора as.

Сам обычно юзаю такой паттерн:

match (dataContext)
{
| listener is INotifyPropertyChanged => listener.PropertyChanged(this, PropertyChangedEventArgs("prop"))
| _ => ();
}
Re: Небезопасное приведение типов
От: BogdanMart Украина  
Дата: 26.04.11 13:42
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Не могу написать вот так:


V>
    
V>    private ConnectToPropertyChanged ( property : string, dataContext : object ) : void
V>    {
V>      def propertyChanged = dataContext : INotifyPropertyChanged;
V>    }

V>


V>ругаеццо двоеточие в объявлении переменных.


V>

V>expected System.ComponentModel.INotifyPropertyChanged, got object in type-enforced expression: System.Object is not a subtype of System.ComponentModel.INotifyPropertyChanged [simple require]


V>Что не так?


:> вместо :
Re: Небезопасное приведение типов
От: hardcase Пират http://nemerle.org
Дата: 26.04.11 13:43
Оценка: +1
Здравствуйте, Visor2004, Вы писали:

V>Не могу написать вот так:


V>
    
V>    private ConnectToPropertyChanged ( property : string, dataContext : object ) : void
V>    {
V>      def propertyChanged = dataContext : INotifyPropertyChanged;
V>    }

V>


V>ругаеццо двоеточие в объявлении переменных.


V>

V>expected System.ComponentModel.INotifyPropertyChanged, got object in type-enforced expression: System.Object is not a subtype of System.ComponentModel.INotifyPropertyChanged [simple require]


V>Что не так?


Подозреваю что тебе тут проверять на null даже не требуется:

private ConnectToPropertyChanged ( property : string, dataContext : object ) : void
{
  match(dataContext)
  {
    | x is INotifyPropertyChanged =>
      x.PropetyChanged += (_, e) =>
      {
         when(e.PropertyName == property)
         {
           ...
         }
      }
    | _ => () // ничего не делаем
  }
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: Небезопасное приведение типов
От: hardcase Пират http://nemerle.org
Дата: 26.04.11 13:46
Оценка: +3
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Visor2004, Вы писали:


V>>получить null в переменной в случае несовместимости типов


Z>К своему стыду не знаю, есть ли в Nemerle аналог оператора as.


Этот оператор не нужен в Nemerle.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Небезопасное приведение типов
От: Visor2004  
Дата: 26.04.11 13:51
Оценка: -1 :)
Вот это мне нравится куда больше

      def propertyChanged = dataContext : INotifyPropertyChanged;
      when ( propertyChanged != null )
        propertyChanged.PropertyChanged += ( s, e ) => when ( e.PropertyName == property ) PropertyChanged ( s, e.PropertyName );


чем вот это

      try
      {
         def propertyChanged = dataContext :> INotifyPropertyChanged;
         propertyChanged.PropertyChanged += ( s, e ) => when ( e.PropertyName == property ) PropertyChanged ( s, e.PropertyName );
      }
      catch ( e : InvalidCastException )
      {

      }


И уж точно намного больше, чем то, что насоветовали гуру выше, с иcпользованием pattern matching.
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[3]: Небезопасное приведение типов
От: hardcase Пират http://nemerle.org
Дата: 26.04.11 14:07
Оценка: +1
Здравствуйте, Visor2004, Вы писали:

V>И уж точно намного больше, чем то, что насоветовали гуру выше, с иcпользованием pattern matching.


ПМ это обычный способ работы с типами выражений, и он значительно удобнее as:
1) связывает имя
2) защищает от null
3) позволяет выполнять множественную диспетчеризацию
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Небезопасное приведение типов
От: BogdanMart Украина  
Дата: 26.04.11 14:08
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, Visor2004, Вы писали:


V>короче, говоря по русски, мне надо аналог "as" из C#+



По сути можно обойтись матчем, а можно написать свой макрос который реализует внутри матч.



macro @:- (exp1, exp2)
{
<[
match($exp1)
{
|$exp1 as $exp2 => $exp1
| _ => null;
}
]>
}
Re[4]: Небезопасное приведение типов
От: Visor2004  
Дата: 26.04.11 15:03
Оценка:
мне не нравится то, что он раздувает код
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[3]: Небезопасное приведение типов
От: Ziaw Россия  
Дата: 26.04.11 15:17
Оценка: +1
Здравствуйте, Visor2004, Вы писали:

V>Вот это мне нравится куда больше


V>
V>      def propertyChanged = dataContext : INotifyPropertyChanged;
V>      when ( propertyChanged != null )
V>        propertyChanged.PropertyChanged += ( s, e ) => when ( e.PropertyName == property ) PropertyChanged ( s, e.PropertyName );
V>


Давай сравним:
match (dataContext)
{
  | propertyChanged is INotifyPropertyChanged => 
    propertyChanged.PropertyChanged += ( s, e ) => when ( e.PropertyName == property ) PropertyChanged ( s, e.PropertyName );

  | _ => ()
}


1. В контексте не создается мусорная переменная (к тому же не гарантировано инициализированная)
2. Условие выполнения кода читается как propertyChanged is INotifyPropertyChanged, а не как безликое propertyChanged != null
3. Если тебе придется дополнить код действиями с другим, возможно реализуемым интерфейсом, сделать это будет гораздо проще

Теперь расскажи, чем тебе нравится больше вариант с приведением и проверкой на нулл, я не могу найти ни одной причины.

P.S. Вариант с ловлей экзепшена — антипаттерн.
Re[5]: Небезопасное приведение типов
От: Ziaw Россия  
Дата: 26.04.11 15:18
Оценка: +1
Здравствуйте, Visor2004, Вы писали:

V>мне не нравится то, что он раздувает код


а ты сравнивал? они абсолютно одинаковы по длине.
Re[6]: Небезопасное приведение типов
От: BogdanMart Украина  
Дата: 26.04.11 20:47
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Visor2004, Вы писали:


V>>мне не нравится то, что он раздувает код


Z>а ты сравнивал? они абсолютно одинаковы по длине.


Самому, когда был молодым не нравилось что нету as-a а сейчас понял что матч в разы круче и скучаю в шарпе за матчем. Матч написать гораздо проще!! так как авто дополнение и все такое, а так надо кастонуть, потом с нулом сравнить.
Re[7]: Небезопасное приведение типов
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.05.11 21:28
Оценка:
Здравствуйте, hardcase, Вы писали:

Z>>К своему стыду не знаю, есть ли в Nemerle аналог оператора as.


H>Этот оператор не нужен в Nemerle.


Он нигде не нужен. Это баг в дизайне языка (пруй линк
Автор(ы): Владислав Чистяков (VladD2)
Дата: 18.12.2004
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.


).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.