Comments 18
Обычно для этого интерфейсы обзывают в стиле IHaveSomeProperty. В целях улучшения читаемости.
0
В F#, кстати, есть generic constraint'ы по сигнатурам методов. Но сделаны они не нативно для CLR, а через атрибуты, от чего понятны только компилятору F#. Выглядят примерно так:
type Class<'T when 'T : (static member staticMethod1 : unit -> 'T) > =
class end
+3
Структурная типизация — это прекрасная вещь в дополнение к «классической» номинативной (в Go мне тоже эта фича понравилась).
Но у вас нет как таковой структурной типизации.
Но у вас нет как таковой структурной типизации.
+1
Структурную типизацию можно реализовать используя T4 или любой другой «препроцессор», либо использовать вейверы, для сторонних библиотек.
PS: Лучше иметь IGetPropertyA и ISetPropertyB
PS: Лучше иметь IGetPropertyA и ISetPropertyB
0
в C#, структурная типизация не поддерживается
Это не совсем верно. Структурная типизация поддерживается в очень ограниченных масштабах. Например, в foreach итерируемый объект должен иметь метод
GetEnumerator
, возвращающий объект с методом MoveNext
и свойством Current
. Оператор await
применим к любому объекту, реализующему awaitable паттерн – опять же, никаких интерфейсов и базовых типов. LINQ-операторы тоже ожидают наличия методов .Select
, .SelectMany
, .Where
и других. Ну и в дополнение ко всему, вроде бы во всех упомянутых сценариях это могут быть как extension-методы, так и «обычные».0
А разве это не утиная типизация?
В википедийной статье по ссылке из поста про различия между структурной и утиной типизациями говорится так:
В википедийной статье по ссылке из поста про различия между структурной и утиной типизациями говорится так:
"...compatibility and equivalence are determined by the type's actual structure or definition [...] It contrasts with [...] duck typing, in which only the part of the structure accessed at runtime is checked for compatibility".
0
Обычно под утиной понимают типизацию в рантайме. А тут всё-таки при компиляции всё происходит.
0
Нет, это именно структурная типизация. Ошибки «несовместимости» детектируются не в рантайме, а в момент компиляции. Например, при попытке использования foreach с объектом, у которого нет метода GetEnumerator, вы получите ошибку компиляции.
0
Sign up to leave a comment.
Структурная типизация в C#