C#编译器编译.txt.obj.java文件

C#编译器编译.txt.obj.java文件,c#,compiler-construction,C#,Compiler Construction,我将文件保存为1.java、2.obj和3.txt。 然后,我使用Visual Studio命令提示符编译文件:csc1.java csc 2.obj csc 3.txt 令人惊讶的是,它将所有3个文件编译成一个可执行文件并成功执行 有人能给我解释一下这种行为吗?文件扩展名对C#编译器来说并不重要:只要它正确地获取了程序的文本,编译器就不会查看文件的名称或扩展名。C#编译器的示例没有提到命名要求* 与Java相比,文件名和位置非常重要。Java编译器只需要*.Java源文件,包括: 源代码文件名

我将文件保存为
1.java
2.obj
3.txt
。 然后,我使用Visual Studio命令提示符编译文件:
csc1.java csc 2.obj csc 3.txt

令人惊讶的是,它将所有3个文件编译成一个可执行文件并成功执行


有人能给我解释一下这种行为吗?

文件扩展名对C#编译器来说并不重要:只要它正确地获取了程序的文本,编译器就不会查看文件的名称或扩展名。C#编译器的示例没有提到命名要求*

与Java相比,文件名和位置非常重要。Java编译器只需要
*.Java
源文件,包括:

源代码文件名必须具有.java后缀,类文件名必须具有.class后缀,并且源文件和类文件都必须具有标识类的根名称


*即使编译器不需要它,
*.cs
仍然是C#源文件普遍接受的命名约定。

建议的约定是将源代码文件名结尾为 扩展.cs,但没有这样做的要求;源文件 例如,可能会被命名为Person.boo

也是从,

类似地,C#源文件的名称不必与名称匹配 在该文件中定义的类或接口的。例如 定义Professor类的代码可以放在名为 Blah.cs,但将源文件名 匹配文件中声明的类或接口的名称


@Akina91这有点难,因为没有提到任何可能暗示源文件及其扩展名有命名约定的内容,另一方面,假设“源代码文件名必须具有.java后缀,类文件名必须具有.class后缀,并且源文件和类文件都必须具有标识类的根名称。”
C#源文件的文件扩展名通常为.cs
Section 1.1,C#language spec 3.0。这里不可以。文件扩展名对后台进程没有任何意义。请注意,在visual studio中,您可以在解决方案资源管理器中选择一个文件,并选择它在编译、标记资源、复制到输出等方面的操作。这在项目中被广泛使用。这并不奇怪:它是一个有效的C#程序。编译器遵循“不要根据封面判断一本书”的规则。“编译器不会根据文件的扩展名或名称来判断文件”。它检查其内容并生成exe文件。现在,如果文件的内容不是有效的C#语句,那将是令人惊讶的。我唯一的评论是,这些文件的源文件通常被命名为
[something].boo
,所以虽然它可以被命名为任何东西,但这是一个糟糕的例子。@FakeName,哇,从来都不知道有一种叫做boo的语言,很有趣。。这本书中有一个例子(可能作者甚至不知道Boo),其思想是文件名+扩展名可以是任何东西
using System;
class Program {
    public static void Main() {
        Console.WriteLine("Hello World!");
        Console.ReadLine();
    }
}