2012-01-31 194 views
0

假设我有一个名为'Foo'的类,有一些静态成员,并且在其他一些类中(在同一个名称空间下)有一个名称相同的工厂方法,它使用此成员:C#类名称 - 方法名称冲突

namespace MyNamespace 
{ 
    public class Foo 
    { 
     public static bool Invert = false; 
     public int A {get; set;} 
     .... 
    } 

    public class FooFactory 
    { 
     public Foo Foo(int A) 
     { 
      if(Foo.Invert) // --> this gives the 'is a 'method', which is not valid in the given context' Error 
       return new Foo(-A); 
      else 
       return new Foo(A); 
     } 
    } 
} 

(为简洁起见,省略了一些代码)。显然,编译器不会将'if'子句中的'Foo'解释为类'Foo',而是作为工厂方法。 假设我无权改变类的名称或工厂方法的名称,我是否可以强制编译器将'Foo'识别为类名而不是方法名?

编辑抱歉,不要提前提到这一点 - 两个类都在同一个命名空间中,因此MyNamespace.Foo.Invert并没有这样做。

+0

类Foo和FooFactory是哪些命名空间的成员?试图指定名称空间的名称,例如'if(Namespace.Foo.Invert)'? – 2012-01-31 13:59:21

回答

1

您的代码不工作,因为你真正尝试是访问MyNamespace.FooFactory.Foo方法,如果它是一个类。如果您指定MyNamespace.Foo,您将指定预期的类。

namespace MyNamespace 
{ 
    public class Foo 
    { 
     public static bool Invert = false; 
     public int A {get; set;} 
     .... 
    } 

    public class FooFactory 
    { 
     public Foo Foo(int A) 
     { 
      if(MyNamespace.Foo.Invert) 
       return new MyNamespace.Foo(-A); 
      else 
       return new MyNamespace.Foo(A); 
     } 
    } 
} 

这将工作。

关于你的编辑,MyNamespace.FooFactory.FooMyNamespace.Foo是不一样的。

+0

呃,一旦我看到它就很明显。我会考虑避免夜间... :-) – bavaza 2012-01-31 19:12:18

4

使用指令进行救援。只需为你的班级创建一个别名。

using FooClass = Namespace.Foo; 

clicky

+1

或者直接使用ns:'if(Namespace.Foo.Invert)...' – 2012-01-31 14:17:56