Здравствуйте, _NN_, Вы писали:
_NN>Однако возможно этот шаг поможет найти еще сторонников из мира C#.
В Немреле столько фич, что все сторонники шарпа уже по 10 раз должны были перейти на немерл. Так что еще одна вряд ли на что-то повлияет. Плюс, чем больше фич, тем сложнее учить язык.
_NN>Я вот не понимаю зачем нужно придумывать имя переменной в методах расширения и почему нельзя было сделать как указано выше
Фарш невозможно провернуть назад. (с)
Можно подумать о более простом (и возможно, менее элегантном) решении. Например, использовать для описания свойства-расширения методы с атрибутами.
Здравствуйте, VladD2, Вы писали:
VD>Тогда их можно будет вызвать как метод. А возможность обращаться к ним как к свойствам будет всего лишь небольшим синтаксическим сахаром.
По сути компилятор именно это и будет генерировать. Можно для начала и так.
А можно и макрос приделать для генерации
И даже квазицитаты новые не требуются.
public staticextension X : int (this m : MyClass) { get { m.Y + 1 } set { m.Y = value - 1 } }
А вариант 2 приберечь для N2 или N1.x.
Только бы не забыть о нём.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, VladD2, Вы писали:
VD>>И то, и то, как-то некузяво. Второй вариант совсем не похож на методы-расширения. Какой-то не явный параметр. Первый просто странный.
_NN>Кстати подумалось, а почему расширения не используют синтаксис _NN>
Здравствуйте, Jack128, Вы писали:
J>using NS1; J>using NS2;
J>в обоих неймспейсах есть одинаковый extension метод ExtensionMethod
J>как вызвать ExtensionMethod из NS1??
Очевидно тут тоже нужен будет другой синтаксис
myObject.NS1.MyExtensions.ExtensionMethod();
А если NS1 есть у myObject, то myObject.global::NS1.MyExtensions.ExtensionMethod();
Или там придумать другой синтаксис типа: myObject.<NS1.MyExtensions.ExtensionMethod>();
P.S.
Я понимаю, нужно все продумать прежде чем бросаться в крайности.
На это и форум
Здравствуйте, VladD2, Вы писали:
VD>Да и как вообще можно сделать события расширениями? Кто их вызвать то будет?
Кто-нибудь другой, естественно.
// без событий-расширений
SomeSingletonList.Add(x);
SomeSingletonList.Event += myHandler;
// с ними
x.Event += myHandler;
Мне кажется, библиотеки вроде Reactive Extensions очень бы выиграли от событий-расширений.
Можно конечно включить фантазию и добавить еще события с индексаторами (и соответствующие расширения), но это уж вряд ли найдет поддержку у коммьюнити
Здравствуйте, VladD2, Вы писали:
VD>Можно подумать о более простом (и возможно, менее элегантном) решении. Например, использовать для описания свойства-расширения методы с атрибутами.
VD>
Здравствуйте, catbert, Вы писали:
C>А в чем, собственно, проблема? Почему нельзя использовать стандартный синтаксис индексаторов + ключевое слово this?
А в чем смысл использования синтаксиса индексаторов? Мы хотим всех запутать?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>А в чем смысл использования синтаксиса индексаторов? Мы хотим всех запутать?
Мне кажется абсолютно логичным и ничуть не запутанным использование
public static PropertyName[this x : Type1] : Type2
{
...
}
для обозначения свойств-расширений.
Для того чтобы превратить метод класса в метод-расширение, мне нужно объявить его публичным, статическим, добавить аргумент с обозначением this, и заменить все ссылки на this внутри метода на этот аргумент.
Для того чтобы превратить свойство класса в свойство-расширение, мне нужно объявить его публичным, статическим, добавить индекс с обозначением this, и заменить все ссылки на this внутри свойства на этот аргумент.
По-моему, все симметрично и понятно. И новый синтаксис не вводится. Держу пари, что если в C# когда-нибудь введут свойства-расширения, у них будет именно такой синтаксис.
Здравствуйте, catbert, Вы писали:
C>Здравствуйте, VladD2, Вы писали:
VD>>А в чем смысл использования синтаксиса индексаторов? Мы хотим всех запутать?
C>Мне кажется абсолютно логичным и ничуть не запутанным использование
C>
C> public static PropertyName[this x : Type1] : Type2
C> {
C> ...
C> }
C>
C>для обозначения свойств-расширений.
А свойства индексаторы как будут выглядеть?
public static PropertyName[this x : Type1] [index : int] : Type2 { .. }
J>using NS1; J>using NS2;
J>в обоих неймспейсах есть одинаковый extension метод ExtensionMethod
J>как вызвать ExtensionMethod из NS1??
Точно так же как сейчас. Статик методом с первым параметром, весь этот синтаксис все равно будет транслироваться в него. Свойства тоже должны быть странслированы в get_PropertyName/set_PropertyName, чтобы их было легко использовать из внешних библиотек.
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, Jack128, Вы писали:
J>>using NS1; J>>using NS2;
J>>в обоих неймспейсах есть одинаковый extension метод ExtensionMethod
J>>как вызвать ExtensionMethod из NS1??
Z>Точно так же как сейчас. Статик методом с первым параметром, весь этот синтаксис все равно будет транслироваться в него. Свойства тоже должны быть странслированы в get_PropertyName/set_PropertyName, чтобы их было легко использовать из внешних библиотек.
а сейчас в N разрешено вызывать непосредственно геттеры/сеттеры свойств? Не extension, а обычных свойств?
Здравствуйте, VladD2, Вы писали: VD>На практике у меня пару раз возникало желание сделать свойство-расширение. А вот события или индексеры ни разу.
VD>Да и как вообще можно сделать события расширениями? Кто их вызвать то будет?
в WPF исползуются AttachedEvent's как и AttachedProprty но нету поддержки сто тсороны С#, только с XAML
а с С# выглядит вот так:
// это AttachedPropery чтобы присвоить соответственно надо вызвать SetDragpublic static readonly DependencyProperty TypeProperty = DependencyProperty.RegisterAttached("Type",
typeof(Type),
typeof(DependencyObject),
new PropertyMetadata((d, e) => SetTypes(d, new Type[] { (Type)e.NewValue })));
public static void SetType(DependencyObject d, Type v)
{
d.SetValue(TypeProperty, v);
}
public static Type GetType(DependencyObject d)
{
return (Type)d.GetValue(TypeProperty);
}
//А это соответсвенно аналогичный ивентpublic static readonly RoutedEvent DropEvent = EventManager.RegisterRoutedEvent("Drop", RoutingStrategy.Bubble,
typeof(Action<UIElement, DropEventArgs>),
typeof(DependencyObject));
public static void AddDropHandler(UIElement source, Action<UIElement, DropEventArgs> handler)
{
source.AddHandler(DropEvent, handler);
}
public static void RemoveDropHandler(UIElement source, Action<UIElement, DropEventArgs> handler)
{
source.RemoveHandler(DropEvent, handler);
}
Вызов из XAML весьма удобочитаем, а вот из кода работать не так удобно, так что таки надо свойства/ивенты расширения.
Здравствуйте, BogdanMart, Вы писали:
BM>Вызов из XAML весьма удобочитаем, а вот из кода работать не так удобно, так что таки надо свойства/ивенты расширения.
Тому, кому захочется — элементарно засахарит макрооператором эти акцессоры для свойств и событий:
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, BogdanMart, Вы писали:
BM>>Вызов из XAML весьма удобочитаем, а вот из кода работать не так удобно, так что таки надо свойства/ивенты расширения.
Во:
obj.Prop from AttachedPropertyClass = 10;
obj.Event from AttachedPropertyClass += value;