Partial method declarations must begin with the contextual keyword partial and the method must return void.
У Nemerle с этим нет заморочек:
using System.Console;
namespace W
{
partial class X
{
partial F() : int
{
1
}
partial G() : string
{
"A"
}
}
partial class X
{
static Main() : void
{
WriteLine(X().F());
WriteLine(X().G());
}
}
}
__>Partial method declarations must begin with the contextual keyword partial and the method must return void.
__>У Nemerle с этим нет заморочек: __>
__>using System.Console;
__>namespace W
__>{
__> partial class X
__> {
__> partial F() : int
__> {
__> 1
__> }
__> partial G() : string
__> {
__> "A"
__> }
__> }
__> partial class X
__> {
__> static Main() : void
__> {
__> WriteLine(X().F());
__> WriteLine(X().G());
__> }
__> }
__>}
__>
__>
__>1
__>A
а где тут partial реализация методов?? То есть метод объявлен в одном файле, а реализовал (или НЕ реализован) в другом. Соответственно что будет возвращать в N если этот метод не реализован?? default(T) ?
Здравствуйте, Jack128, Вы писали:
J>а где тут partial реализация методов?? То есть метод объявлен в одном файле, а реализовал (или НЕ реализован) в другом. Соответственно что будет возвращать в N если этот метод не реализован?? default(T) ?
На самом деле очевидно partial не работает.
namespace W
{
partial class X
{
partial void F();
}
class P
{
static void Main()
{
}
}
}
Компилируется
namespace W
{
partial class X
{
public partial F() : void;
static Main() : void
{
}
}
}
error: missing body of a non-abstract and non-extern method in method W.X.F() : void
Здравствуйте, VladD2, Вы писали:
VD>В немерле нет partial-методов и они ему не особо нужны, так как вместо внешних кодогенераторов куда удобнее использовать макросы.
Не знаю как остальные, а я partial использую ещё для удобства.
Node.Server.cs
Node.Client.cs
Node.IO.cs
и т.д.
Если класс длинный это очень удобно и partial хорош не только для кодогенерации.
Я быть печальный если в Nemerle такого немай.
«История жизни – это, по существу, развитие сознания, которое завуалировано морфологией.» Пьер Тейяр де Шарден
Здравствуйте, Rival, Вы писали:
R>Если класс длинный это очень удобно и partial хорош не только для кодогенерации. R>Я быть печальный если в Nemerle такого немай.
Речь идет о partial-методах. С partial-типами (варианты, классы, структуры, интефейсы) все в порядке.
Здравствуйте, Rival, Вы писали:
VD>>В немерле нет partial-методов и они ему не особо нужны, так как вместо внешних кодогенераторов куда удобнее использовать макросы.
R>Не знаю как остальные, а я partial использую ещё для удобства. R>Node.Server.cs R>Node.Client.cs R>Node.IO.cs R>и т.д.
R>Если класс длинный это очень удобно и partial хорош не только для кодогенерации. R>Я быть печальный если в Nemerle такого немай.
Причем тут класс? partial-классы доступны и в Немерле. Здесь же речь идет о partial-методах. Это весьма спорная выдумка создателей шарпа. Предназначена она исключительно для внешних кодогенераторов. Суть ее заключается в том, что программист может объявить метод с возвращаемым значением типа void, но при этом не описывать тело такого метода. Такой метод будет доступен в IDE. Если в процессе компиляции внешняя утилита сгенерирует такой же метод с телом, то в программу попадет именно он. Иначе все вызовы этого метода будут игнорироваться.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Причем тут класс? partial-классы доступны и в Немерле. Здесь же речь идет о partial-методах. Это весьма спорная выдумка создателей шарпа. Предназначена она исключительно для внешних кодогенераторов. Суть ее заключается в том, что программист может объявить метод с возвращаемым значением типа void, но при этом не описывать тело такого метода. Такой метод будет доступен в IDE. Если в процессе компиляции внешняя утилита сгенерирует такой же метод с телом, то в программу попадет именно он. Иначе все вызовы этого метода будут игнорироваться.
А, тогда всё окей, а то испугался что речь про partial классов. Не внимательно прочёл тред — не выспался.
«История жизни – это, по существу, развитие сознания, которое завуалировано морфологией.» Пьер Тейяр де Шарден
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, hardcase, Вы писали:
H>>Это потому что Nemerle не обращает на модификатор partial в методах никакого внимания.
VD>Что есть баг. Надо ошибку выдавать.
Здравствуйте, VladD2, Вы писали:
>Может ли в .Net CLR или JVM (т.е. в рантаймах рассчитанных на номинативную систему типов) жить язык со структурной типизацией? >И если может, насколько при этом такой язык будет "своим" в этих рантаймах?
Цитата:
If two or more anonymous types have the same number and type of properties in the same order, the compiler treats them as the same type and they share the same compiler-generated type information.
Похоже в CLR уже есть поддержка структурной типизации, по крайней мере для анонимных типов.
Здравствуйте, VladD2, Вы писали:
VD>Причем тут класс? partial-классы доступны и в Немерле. Здесь же речь идет о partial-методах. Это весьма спорная выдумка создателей шарпа. Предназначена она исключительно для внешних кодогенераторов. Суть ее заключается в том, что программист может объявить метод с возвращаемым значением типа void, но при этом не описывать тело такого метода. Такой метод будет доступен в IDE. Если в процессе компиляции внешняя утилита сгенерирует такой же метод с телом, то в программу попадет именно он. Иначе все вызовы этого метода будут игнорироваться.
Существующий софт на макросы не перепишешь. Макросы хорошо, но partial методы поддерживать тоже надо. Кстати там ещё есть ограничени на отсутствие out параметров.
Здравствуйте, Аноним, Вы писали:
А>If two or more anonymous types have the same number and type of properties in the same order, the compiler treats them as the same type and they share the same compiler-generated type information.
А>Похоже в CLR уже есть поддержка структурной типизации, по крайней мере для анонимных типов.
Нет там ее, и небыло никогда. Компилятор же просто кэширует сигнатуры анонимных типов, в Nemerle используется аналогичный подход для работы с ними.
Здравствуйте, adontz, Вы писали:
A>Существующий софт на макросы не перепишешь. Макросы хорошо, но partial методы поддерживать тоже надо. Кстати там ещё есть ограничени на отсутствие out параметров.
Как предложение по улучшению — ок, мы подумаем. Но это точно не первостепенной важности требование.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[7]: Частичные методы Nemerle vs. C#
От:
Аноним
Дата:
26.03.11 13:00
Оценка:
Здравствуйте, hardcase, Вы писали:
H>Нет там ее, и небыло никогда. Компилятор же просто кэширует сигнатуры анонимных типов, в Nemerle используется аналогичный подход для работы с ними.
Так компилятор же, а для Runtime (то есть CLR) похоже такие типы воспринимаются одинаково.
Хотя, по идее, среда выполнения должна их различать.
Но тут надо копнуть поглубже, конечно.
Может там какой-то атрибут скрытый ставится у типа, что его можно считать структурно таким же, как и другие типы с таким же набором полей.
Здравствуйте, Аноним, Вы писали:
А>Так компилятор же, а для Runtime (то есть CLR) похоже такие типы воспринимаются одинаково.
Откройте рефлектором или ILSpy-ем любую сборку с анонимными типами C# и посмотрите своими глазами. Это обычные Record-like классы с переопределенными Equals и GetHashcode.
А>Хотя, по идее, среда выполнения должна их различать.
Структурно эквивалентные анонимные типы из разных сборок будут разными классами для CLR и Equals для них будет возвращать False (в Nemerle это, кстати, не так — у нас Equals будет работать для эквивалентных анонимных типов из разных сборок).
Здравствуйте, adontz, Вы писали:
A>Существующий софт на макросы не перепишешь. Макросы хорошо, но partial методы поддерживать тоже надо. Кстати там ещё есть ограничени на отсутствие out параметров.
Существующий софт умеет генерировать Nemerle-код? Нет? Тогда о чем ты ведешь речь?
Генераторов кода в формате Nemerle и вряд ли возникнет просто потому, что их удобнее писать на макросах. Посему фича полностью не нужная в немерле.
Скажу больше — эта фича является детектором недостатков языков в которых она нужна.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
A>>Существующий софт на макросы не перепишешь. Макросы хорошо, но partial методы поддерживать тоже надо. Кстати там ещё есть ограничени на отсутствие out параметров. VD>Существующий софт умеет генерировать Nemerle-код? Нет? Тогда о чем ты ведешь речь?
Здравствуйте, Аноним, Вы писали:
А>Так компилятор же, а для Runtime (то есть CLR) похоже такие типы воспринимаются одинаково. А>Хотя, по идее, среда выполнения должна их различать.
В .Net 4 появилась ограниченная структурная эквивалентность для интерфейсов, структур (вэлью-типов) и делегатов. Сделано это, в основном, для того чтобы можно было хранить копии метаданных для COM-объектов в разных сборках и при этом иметь возможность передавать ссылки между сборками (т.е. для избавления от interop-сборок).
Структурной эквивалентности для классов нет и не планируется.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>В .Net 4 появилась ограниченная структурная эквивалентность для интерфейсов, структур (вэлью-типов) и делегатов. Сделано это, в основном, для того чтобы можно было хранить копии метаданных для COM-объектов в разных сборках и при этом иметь возможность передавать ссылки между сборками (т.е. для избавления от interop-сборок).
VD>Структурной эквивалентности для классов нет и не планируется.
А где про это можно почитать? Мне кажется структурной эквивалентности интерфейсов должно быть вполне достаточно, чтобы работать со ссылочными типами.
Здравствуйте, Ziaw, Вы писали:
Z>А где про это можно почитать?
Где-то в МСДН-е дыло. В разделе связанном с ком-интеропом.
Z>Мне кажется структурной эквивалентности интерфейсов должно быть вполне достаточно, чтобы работать со ссылочными типами.
Не совсем так, но конечно лучше чем ничего. Попробуем в Н2 выжить из этого что-то.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.