C# .Net扩展方法(此字符串Foo)仅部分可见

C# .Net扩展方法(此字符串Foo)仅部分可见,c#,methods,intellisense,C#,Methods,Intellisense,这是一个关于.Net(特别是C#)中扩展方法可见性的问题,以及为什么intellisense可以工作,但编译器在同一段代码上失败 想象一下 我有一个.NET3.5类库,由一堆对象和一个扩展方法类组成。以下是其中一种方法: namespace MyApp.Extensions { public static class ExtensionMethods { public static string ToTitleCase(this string Origcase)

这是一个关于.Net(特别是C#)中扩展方法可见性的问题,以及为什么intellisense可以工作,但编译器在同一段代码上失败

想象一下

我有一个.NET3.5类库,由一堆对象和一个扩展方法类组成。以下是其中一种方法:

namespace MyApp.Extensions
{
    public static class ExtensionMethods
    {
        public static string ToTitleCase(this string Origcase)
        {   string TitleCase = Origcase;
            ... implementation ...
            return TitleCase;
        }
    }
要在类库本身中使用扩展方法,需要其中一个方法的每个类都需要指定:

using MyApp.Extensions;
因为这是一个与库的其余部分不同的名称空间。所有这些都很好

现在,一个.NET2.0网站正确地引用了这个库,并且一个类文件希望使用这个库。因此,它宣布:

using MyApp.Extensions
这似乎很好,在键入字符串时,Intellisense确实看到扩展方法挂起在字符串实例上:

我喜欢一个计划的结合

然而,这就是快乐的结束

尝试生成网站时,生成失败,并显示以下消息:

当尝试将ExtensionMethods类直接复制到web项目中时,构建再次失败。这一次,因为“这”一词是意料之中的

奇怪的是,extension方法与普通静态方法一样有效:

…而且构建工作正常(因此问题实际上并不在于“this”关键字)。事实上,无论ExtensionMethods类是在类库中还是在网站中,构建都是有效的

换句话说,这确实解决了问题,构建也会成功

…但解决方案很糟糕

问:在这种情况下,是否有某种秘密技巧可以让扩展方法正确工作

我尝试过“namespace System.Runtime.CompilerServices”技巧,但似乎没有帮助

什么会导致Intellisense正确地查看扩展方法,并且编译器失败


注意:精心设计的示例变量应该被称为“name”而不是“FirstName”,但您明白了。

您的网站正在使用.Net 2.0运行,它不支持扩展方法/类。因此.NET2.0编译器将其视为正常的静态方法。它将仅在.net 3.5中编译

在web.config中,尝试添加到system.web/pages/namespaces节点

<system.web>
    ....
    <pages ....>
        ....
        <namespaces>
            ....
            <add namespace="MyApp.Extensions" />

....
....
....
您还需要确保ASP.NET编译器处于3.5模式:

<system.codedom>
  <compilers>
    <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4"
              type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <providerOption name="CompilerVersion" value="v3.5"/>
      <providerOption name="WarnAsError" value="false"/>
    </compiler>
 </compilers>
</system.codedom>


我决不建议在任何
命名空间中保留
扩展
方法

Bzzzz,回答错误,使用VS2008是可能的。请看我的答案。@leppie:这里是运行VS2005的网站。。。扩展类/方法仅在.net3.0+中支持。我使用的第三方网站要求它保持为.NET2.0网站。这是否违反了这一要求?(我会做一些测试来看看,但我会把你的答案碰上,因为它在钱上是正确的)如果.Net 2.0站点没有抱怨“CompilerVersion”属性,我会回来把它标记为已接受的答案。@FlipScript-.Net 2.0或ASP.Net 2.0?它仍然是一个ASP.NET 2.0站点。NET2.0更为棘手。。。在依赖项中有一个3.5 dll(“我有.Net 3.5类库”),这已经有点不确定了——除非您部署System.Core,它可能已经无法在缺少3.5的服务器上工作了。是的,它是一个ASP.Net 2.0站点。类库一直都是3.5版本的,服务器也有.NET3.5版本,一切都正常。然而,这是我们第一次在ASP.NET 2.0站点中引入扩展方法。@FlipScript-应该可以了;2.0以上的下一个ASP.NET版本是4.0;它仍然是一个ASP.NET 2.0站点。为什么不呢?“使用*.Extensions”不是完全遵循.Net framework约定吗?是的,但只是为了防止在任何地方使用
语句编写
,我让它的扩展类
名称空间少一些
。我想这取决于您使用扩展的频率。在大约80个类中,我只需要2个类中的扩展,因此没有必要污染其他78个类的名称空间。