file (C# Reference)
Beginning with C# 11, the file
contextual keyword is a type modifier.
The file
modifier restricts a top-level type's scope and visibility to the file in which it's declared. The file
modifier will generally be applied to types written by a source generator. File-local types provide source generators with a convenient way to avoid name collisions among generated types. The file
modifier declares a file-local type, as in this example:
file class HiddenWidget
{
// implementation
}
Any types nested within a file-local type are also only visible within the file in which it's declared. Other types in an assembly may use the same name as a file-local type. Because the file-local type is visible only in the file where it's declared, these types don't create a naming collision.
A file-local type can't be the return type or parameter type of any member that is more visible than file
scope. A file-local type can't be a field member of a type that has greater visibility than file
scope. However, a more visible type may implicitly implement a file-local interface type. The type can also explicitly implement a file-local interface but explicit implementations can only be used within the file
scope.
Example
The following example shows a public type that uses a file-local type to provide a worker method. In addition, the public type implements a file-local interface implicitly:
// In File1.cs:
file interface IWidget
{
int ProvideAnswer();
}
file class HiddenWidget
{
public int Work() => 42;
}
public class Widget : IWidget
{
public int ProvideAnswer()
{
var worker = new HiddenWidget();
return worker.Work();
}
}
In another source file, you can declare types that have the same names as the file-local types. The file-local types aren't visible:
// In File2.cs:
// Doesn't conflict with HiddenWidget
// declared in File1.cs
public class HiddenWidget
{
public void RunTask()
{
// omitted
}
}
C# language specification
For more information, see Declared accessibility in the C# Language Specification, and the C# 11 - File local types feature specification.