C#中myClass的双重性

时间:2011-04-08 01:47:16

标签: c# .net

myclass 在以下示例中作为字符串以及 myClass 工作。

我知道每个人都会说这不是一个好习惯,使用类似下面的例子

CODE:

class myClass
{
    public static void Main(string[] args)
    {   
        string @myClass = "my-Class";

        myClass.Replace("-", " ");  //myClass works as string
        myClass ob = new myClass();  //myClass works as myClass

        ob.i();
    }
    public void i()
    {

    }
}

但我想知道:

  • 这是编译器错误吗? 作为编译器应该发出警告。
  • 编译器如何管理这种双重性质?

5 个答案:

答案 0 :(得分:3)

你基本上只是在做一些看起来很奇怪的事情,但编译器可以根据上下文弄清楚它。

string @myClass = "my-Class";

这是声明一个名为myClass的字符串变量。在变量名上使用@允许您创建具有通常不允许的名称的变量(例如关键字)。在您的情况下,不需要@,因为myClass不是关键字,但您仍然可以使用它。有关信息,请参阅此问题:What does the @ symbol before a variable name mean in C#?

myClass.Replace("-", " ");

这是在你的myClass变量上调用字符串Replace方法。

myClass ob = new myClass();

这是创建一个“myClass”类型的新对象。编译器可以根据用法告诉我,myClass的这种用法是指类型,而不是字符串变量。

答案 1 :(得分:2)

请注意,您甚至不需要@

string myClass = "my-Class";

上述情况非常好。

你说:

compiler should give warning.

应该吗?实际上没有歧义。

考虑这个非常典型的场景:

public class MyRandom
{
    public Random Random { get; private set; }

    public MyRandom()
    {
        // Is this ambiguous? No--the left HAS to be the property;
        // the right HAS to be the type name.
        Random = new Random();
    }
}

变量的名称也是 types 的名称并不罕见。只有当一些成员重叠时才会出现歧义。例如:

public class MyThreadPool
{
    public static void Add(Thread thread)
    {
        Console.WriteLine("Called the static method.");
    }
}

public class SomeOtherClass
{
    public List<Thread> MyThreadPool { get; private set; }

    public SomeOtherClass()
    {
        MyThreadPool = new List<Thread>();
    }

    public void DoSomethingAmbiguous()
    {
        // To me, it would make sense for the compiler to issue a warning here,
        // as it seems rather ambiguous (to me at least). However, it doesn't,
        // which tells me the behavior is defined somewhere in the spec (I'm too lazy
        // to check).
        MyThreadPool.Add(null);
    }
}

答案 2 :(得分:1)

下面的行是指您使用字符串@myClass而不是myClass类定义的字符串变量。

myClass.Replace("-", " ");  //myClass works as string

答案 3 :(得分:1)

您使用myclass作为类型和变量名称 - 编译器可以区分它们中的两个,只有当它们发生冲突时才会出现问题 - 即在Main方法中这会产生编译器错误:

myClass.Main(new string [1]);

答案 4 :(得分:0)

第一个@myClass是实例或变量名,这不会与类(类型)名称myClass冲突。

所以没有错误或警告。