为什么扩展方法不适用于命名空间别名?

Ian*_*n P 16 c# .net-3.5 visual-studio-2008

这可能是一个无知的问题,但我不确定为什么我不能一起使用命名空间别名和扩展方法.

以下示例工作得很好:

Program.cs中

using System;
using ExtensionMethodTest.Domain;

namespace ExtensionMethodTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var m = new Domain.MyClass();
            var result = m.UpperCaseName();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MyClass.cs

using System;

namespace ExtensionMethodTest.Domain
{
    public class MyClass
    {
        public string Name { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

MyClassExtensions.cs

using System;

namespace ExtensionMethodTest.Domain
{
    public static class MyClassExtensions
    {
        public static string UpperCaseName (this MyClass myClass)
        {
            return myClass.Name.ToUpper();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在Program.cs中将域别名如下:

using Domain = ExtensionMethodTest.Domain;
Run Code Online (Sandbox Code Playgroud)

扩展方法不再有效..

当我处理将各种域对象转换为合同对象(假设我有4个域程序集和4个合同程序集)用于Web服务时,这可能会相当令人沮丧.使用别名将非常方便,因为我可以如下别名并继续使用各种扩展方法(如ToContract等):

using BillingContracts = Namespace.Billing.Contracts;
using IssuingContracts = Namespace.Issuing.Contracts;
Run Code Online (Sandbox Code Playgroud)

等等...

我期待着答案......我确信这是直截了当的,但是,对于我的生活,我无法弄清楚为什么它不起作用.

谢谢!

m-y*_*m-y 11

确保仍然添加一个无别名的 using语句:

Program.cs中

using System;
using ExtensionMethodTest.Domain; //DON'T FORGET A NON-ALIASED USING
using MyDomain = ExtensionMethodTest.Domain;

namespace ExtensionMethodTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var m = new MyDomain.MyClass();
            var result = m.UpperCaseName();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MyClass.cs

using System;

namespace ExtensionMethodTest.Domain
{
    public class MyClass
    {
        public string Name { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

MyClassExtensions.cs

using System;

namespace ExtensionMethodTest.Domain
{
    public static class MyClassExtensions
    {
        public static string UpperCaseName (this MyClass myClass)
        {
            return myClass.Name.ToUpper();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 别名using语句确实*不*将别名命名空间带入名称解析范围.它只是提供了特定命名空间的别名以方便使用.尽管这两个语句都是"使用"语句,但它们的行为完全不同.考虑"使用X"可能会有所帮助; 作为命名空间#include,和"使用Foo = X;" 作为命名空间#define. (8认同)