Сегодня использовал варианты, объявленные в немерловой сборке, в C#.
Вот есть у нас такой код в Nemerle
public variant Name
{
| Var1
| Var2 { p : string }
}
И вот так мы хотим использовать его в C#
var var1 = new Name.Var1(); // Get compiler error "has no constructors defined"
var var2 = new Name.Var2(""); // It is compiled
В первой строке получаем ошибку, так как если у варианта нет полей, то компилятор реализует его синглтоном. То есть делает приватный конструктор, а экземпляр сохраняет в статическом поле _N_constant_object.
Использовать варианты в C# следует вот так:
var var1 = Name.Var1._N_constant_object;
var var2 = new Name.Var2("");
Не красиво...
Я понимаю, что это оптимизация, что если писать на Nemerle, то никаких проблем с вариантами нет. Но периодически приходится сопрягать код немерле и C# и тогда подобные вещи бросаются в глаза. Мои соображения, как сделать сопряжение в этом месте более гладким:
1. Хотя бы переименовать _N_constant_object во что-то более читабельное, Instance например.
2. Можно открыть у варианта без параметров конструктор. Код Nemerle останется оптимизированным, код C#, который использует варианты, будет неоптимизирован.
3. Можно закрыть конструктор и у варианта с параметрами. Работать с вариантом как-то так:
var var1 = Name.Var1.Instance;
var var2 = Name.Var2.Instance[""];
Здравствуйте, /Forester/, Вы писали:
F>Я понимаю, что это оптимизация, что если писать на Nemerle, то никаких проблем с вариантами нет. Но периодически приходится сопрягать код немерле и C# и тогда подобные вещи бросаются в глаза. Мои соображения, как сделать сопряжение в этом месте более гладким:
F>1. Хотя бы переименовать _N_constant_object во что-то более читабельное, Instance например.
Префикс _N_ говорит о том, что это сгенерированный код, и его не стоит трогать.
F>2. Можно открыть у варианта без параметров конструктор. Код Nemerle останется оптимизированным, код C#, который использует варианты, будет неоптимизирован.
Этот вариант выглядит наиболее порядочным.
Какие были причины закрывать конструктор увы не знаю.
F>3. Можно закрыть конструктор и у варианта с параметрами. Работать с вариантом как-то так:
F>F>var var1 = Name.Var1.Instance;
F>var var2 = Name.Var2.Instance[""];
F>
И зачем создавать фабрику вместо обычного конструктора ?
Здравствуйте, /Forester/, Вы писали:
F>1. Хотя бы переименовать _N_constant_object во что-то более читабельное, Instance например.
F>2. Можно открыть у варианта без параметров конструктор. Код Nemerle останется оптимизированным, код C#, который использует варианты, будет неоптимизирован.
F>3. Можно закрыть конструктор и у варианта с параметрами. Работать с вариантом как-то так:
Во-первых действительно, надо стараться не выставлять варианты в публичный интересный предназначенный для других языков. В любом случае использовать вариантные типы из Шарпа будет неудобно.
Во-вторых, раз уж это происходит, можно сделать фабричные методы для создания экземпляров варианта:
public variant Name
{
| Var1
| Var2 { p : string }
static CreateVar1() : Name { Var1() }
static CreateVar2(p : string) : Name { Var2(p) }
}
Что касается внесения в язык каких-то возможностей. То тут нужно продумать как это должно выглядеть. Если найдем красивое решение, сделать его будет не сложно.