Вопрос

В Scala я могу определить Структурные типы следующее:

type Pressable = { def press(): Unit }

Это означает, что я могу определить функцию или метод, который принимает в качестве аргумента то, что нажимается, как это:

def foo(i: Pressable) { // etc.

Объект, который я передаю эту функцию, должен быть определен для него метод, называемый нажмите (), который соответствует сигнатуре типа, определенной в типе, не принимает аргументов, возвращает блок (версия Void Scala).

Я даже могу использовать структурный тип встроенной:

def foo(i: { def press(): Unit }) { // etc.

Он в основном позволяет программисту иметь все преимущества ввода утки, находясь в результате проверки типа компиляции-временного типа.

C # есть что-то похожее? Я гугла, но не могу ничего найти, но я не знаком с C # в любой глубине. Если нет, есть ли планы добавить это?

Это было полезно?

Решение

Нет, и никаких планов, о которых я знаю. Только названный (а не структурный) подтипин (например, интерфейсы).

(Другие могут хотеть также увидеть

http://en.wikipedia.org/wiki/nominative_type_system.

http://en.wikipedia.org/wiki/structural_type_system.

)

(Несколько человек могут указать некоторые экзотические угловые случаи, как foreach заявление с использованием структурной печати для GetEnumerator, но это исключение а не правило.)

Другие советы

Там нет способа определить структурные типы, которые имеют определенную функцию. Существует библиотека, которая добавляет уток, набравную поддержку C #, которые можно найти здесь.

Это пример из проекта ввода утки. Обратите внимание на Утка, набрав, происходит во время выполнения и может потерпеть неудачу. Отказ Я также понимаю, что эта библиотека генерирует прокси для типов, которые набираются утки, которая намного плачет из элегантной поддержки с компиляцией, которая наслаждается в Scala. Это, скорее всего, настолько хорош, так как он получает с этим поколением C #.

public interface ICanAdd
{
    int Add(int x, int y);
}

// Note that MyAdder does NOT implement ICanAdd, 
// but it does define an Add method like the one in ICanAdd:
public class MyAdder
{
    public int Add(int x, int y)
    {
        return x + y;
    }
}

public class Program
{
    void Main()
    {
        MyAdder myAdder = new MyAdder();

        // Even though ICanAdd is not implemented by MyAdder, 
        // we can duck cast it because it implements all the members:
        ICanAdd adder = DuckTyping.Cast<ICanAdd>(myAdder);

        // Now we can call adder as you would any ICanAdd object.
        // Transparently, this call is being forwarded to myAdder.
        int sum = adder.Add(2, 2);
    }
}

Это C # способ достижения того же, используя хорошие одобрые сверлильные интерфейсы.

interface IPressable {
  void Press();
}

class Foo {
 void Bar(IPressable pressable) {
    pressable.Press();
 }
}

class Thingy : IPressable, IPushable, etc {
 public void Press() {
 }
}

static class Program {
 public static void Main() {
  pressable = new Thingy();
  new Foo().Bar(pressable);
 }
}

Как отметили другие, это не В самом деле Доступно в .NET (как это больше вопрос времени выполнения, чем язык). Однако .NET 4.0 поддерживает подобную вещь для импортированных интерфейсов COM, и я полагаю, что это может быть использовано для внедрения структурных набрав для .NET. Смотрите этот блог пост:

Я еще не пытался играть с этим, но я думаю, что это может позволить компилятору авторов писать языки со структурным набранием для .NET. (Идея состоит в том, что вы (или компилятор) определит интерфейс за сценой, но он будет работать, потому что интерфейсы будут рассматриваться как эквивалент благодаря функции COM эквивалентности).

Кроме того, C # 4.0 поддерживает dynamic Ключевое слово, которое, я думаю, можно интерпретировать как структурное набрав (без проверки статического типа). Ключевое слово позволяет вызывать методы на любом объекте без знарения (при компиляции времени), будет ли объект будет иметь необходимые методы. Это, по сути, то же самое, что и проект «Утка», упомянутый Игором (но это, конечно, не является надлежащим структурным типом).

Очередным рисунком в C # может быть интерпретировано как ограниченный, специальный экземпляр структурного подтипона / экзистенциального набора набора. Компилятор будет только await объекты, которые имеют доступ к GetAwaiter() метод, который возвращает любой INotifyCompletion объект с определенным набором методов и свойств. Поскольку ни «Очередной» объект, ни объект «avaiper» не должен реализовать любой интерфейс (кроме INotifyCompletion В случае последнего), await похож на метод, который принимает структурно набранные обыскими объектами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top