2012-05-05 4 views
1

Этот пример дает «тип или пространство имен имя„MyType“не может быть найден (вы пропали без вести с помощью директивы или ссылка на сборку?)»Можно ли объявить рекурсивную директиву alias в C#?

using MyType = System.Func<System.Int32, System.Tuple<System.Int32, MyType>>; 

Является ли это вообще возможно объявить рекурсивный тип как это?

+2

Обычно я не спрашиваю об этом, но ... почему? –

+0

Я просто играю вокруг, пытаясь объявить минимальную кодировку модели актера в C#, поэтому, хотя я бы использовал рекурсивный псевдоним функции для моделирования поведения, изменяющего характер участников. –

+1

Я не думал об этом более нескольких минут, но, по моему подозрению, вы, вероятно, хотите какой-то общий завод, например. 'CreateActor ', который возвращает объект с помощью 'public Func > action;' но у меня нет ничего конкретного с моей головы. –

ответ

1

Нет, я не думаю, что это возможно. Правая часть вашего оператора using должна быть разрешена к реальному типу, прежде чем вы сможете назначить ему псевдоним. В вашем случае, чтобы разрешить правостороннюю сторону, компилятор должен полностью определить алиасы ... которые требуют, чтобы он разрешил правую часть. Эта рекурсивная проблема не имеет конца, поэтому компилятор явно не собирается беспокоиться.

Для того, чтобы проблема здесь более ясно: предположим, компилятор удалось скомпилировать псевдоним, и я сделал это:

MyType mytype = x => Tuple<int, MyType>.Create(x, ???); 

Что я мог можно положить в теле функции для определения возвращаемого значения ? В конце концов мне нужно, чтобы возвращаемый конструктивный тип возвращался.

+0

MyType myType = x => Tuple . Создайте (x + 1, (y) => myType (y + x) .Item2); –

+0

Но я думаю, что вы правы, этот подход приведет к большей головной боли, чем результатам ... –

0

Предполагая, что вы говорите об использовании директивы (в верхней части файла) и MyType существует, да, это возможно. Например, это совершенно законно:

using System; 
using String = System.Func<System.String>; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      String myString =() => "Foo"; 
      // myString is now a function returning the string "Foo". Yikes. 
     } 
    } 
} 

При этом он никогда не будет проходить проверку кода мной. Поговорите о запутывании.

+0

Я не думаю, что он хочет: замените «String» на «Foo», и у вас есть функция, которая вернула функцию, которая вернула функцию, которая вернула функцию ... –

+0

В примере строки отображается «Тип или имя пространства имен «String» не может быть найдено (вам не хватает директивы using или ссылки на сборку?) » –

+0

Отредактировано так, что оно компилируется. –

Смежные вопросы