【问题标题】:F# type extensions in C# project: System.Runtime.CompilerServices.Extension missed?C# 项目中的 F# 类型扩展:System.Runtime.CompilerServices.Extension 错过了?
【发布时间】:2009-11-03 11:52:30
【问题描述】:

我正在研究 F#,它非常吸引人。我正在尝试将可选类型和 C# 结合起来,例如 here。很有趣的事情......但是我想念一些重要的事情:

#light
namespace MyFSharp

// C# way
[<System.Runtime.CompilerServices.Extension>]
module ExtensionMethods =
    [<System.Runtime.CompilerServices.Extension>]
    let Great(s : System.String) = "Great"


using System;
using MyFSharp;  // reference the F# dll
class Program
{
    static void Main(string[] args)
    {
        var s = "foo";
        //s.Awesome(); // no
        Console.WriteLine(s.Great());  // yes
    }
}

这很简单——我想这对我来说还为时过早……我明白了:

The type 'Extension' is not defined 

也许为时过早...但我就是不明白为什么找不到它。

谢谢, 马吕斯

【问题讨论】:

  • 您应该在两个不同的 pre 块中显示 F# 和 C# 代码。我的意思是说使用 System; 在上面的普通文本中添加一个“C#:”;以避免混淆。乍一看,您似乎正在尝试在 F# 中使用类/Main 方法。

标签: c# f# extension-methods


【解决方案1】:

您的 F# 项目是否引用了 System.Core 程序集?

编辑:嗯...也许明确地称它为ExtensionAttribute 而不仅仅是Extension?也许如果指定了命名空间(而不仅仅是一个简单的名称)它不会尝试使用Attribute 后缀?

【讨论】:

  • 是的,它有。默认情况下,afaik VS 添加此参考
【解决方案2】:

扩展方法在静态类中需要是静态的。 F# 真的会发出它吗?如果没有,那你就不走运了。

更新

我刚试了一下,它似乎发出了静态类和方法。我得到了和你一样的错误,但通过编译修复:

fsc -r System.Core test.fs

然后在 Reflector 中查看程序集的输出,看起来一切正常,应该可以工作。

【讨论】:

    【解决方案3】:

    听起来您的 F# 项目针对的是 .Net Framework 2.0。

    尝试将其更改为 .Net Framework 3.5(在项目属性 -> 应用程序下)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      相关资源
      最近更新 更多