【问题标题】:Is it possible to declare a recursive using alias directive in C#?是否可以在 C# 中使用别名指令声明递归?
【发布时间】:2012-05-05 22:26:15
【问题描述】:

此示例给出“找不到类型或命名空间名称'MyType'(您是否缺少 using 指令或程序集引用?)”

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

是否可以声明这样的递归类型?

【问题讨论】:

  • 我通常不会问这个,但是……为什么?
  • 我只是想在 C# 中声明演员模型的最小编码,所以我想使用递归函数别名来模拟演员的行为改变性质。
  • 我已经考虑了几分钟,但我怀疑你可能想要某种通用工厂,例如一个CreateActor&lt;T&gt;,它返回一个带有public Func&lt;int, Tuple&lt;int, T&gt;&gt; action; 的对象,但我没有想到任何具体的东西。
  • 是的,我想我得到了相同的结论来制定下面的元组实例化。不得不注入一个惰性求值步骤来中断递归,我猜工厂类型也算。
  • 出于好奇,我最终只使用了一个接口: public interface Behavior { Behavior Recieve(Message message, Action activator); }

标签: c# using-directives type-alias


【解决方案1】:

不,我不认为这是可能的。 using 语句的右侧需要解析为真实类型,然后才能为其分配别名。在您的情况下,为了解析右侧,编译器必须完全定义别名...这需要它来解析右侧。这个递归问题没有结局,所以编译器显然不会去打扰。

为了让这里的问题更清楚:让我们假设编译器设法编译了你的别名,我这样做了:

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

我可以在函数体中放入什么来定义返回值?最终我需要在某处返回一个可构造的类型。

【讨论】:

  • MyType myType = x => 元组.Create(x+1, (y) => myType(y+x).Item2);
  • 但是我觉得你是对的,这种做法会比结果更让人头疼……
【解决方案2】:

假设您正在谈论 using 指令(在文件顶部)并且 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.
        }
    }
}

也就是说,它永远不会通过我的代码审查。谈论混乱。

【讨论】:

  • 我不认为他想要什么是可能的:用“Foo”替换“String”并且你有一个返回函数的函数返回一个返回函数的函数......
  • 字符串示例给出“找不到类型或命名空间名称'String'(您是否缺少 using 指令或程序集引用?)”
  • @MichaelEdenfield 当然右手边必须解析为一个类型。我的观点是,上述方法有效。
  • 但上述有效的方法不是 OP 所要求的(我不认为)。
  • 它适用于 MyType,只要您不在定义 MyType 的同一文件中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多