我在工作中编写了一个C#库供内部使用.用例是非常具体的,所以我希望使用它的人有几个样本Program.cs来开始他们.

我遇到的问题是,如果我什么都不做,我会收到一堆错误"只有一个编译单元可以有顶层语句",这是我的示例所预期的,所以我添加了一个:

<ItemGroup>
    <Compile Remove="Samples\Program-*.cs"/>
    <Content Include="Samples\Program-*.cs"/>
</ItemGroup>

第一行从解决方案中删除文件,而第二行将它们作为内容文件添加回来.

现在一切正常,但是我对这个解决方案非常恼火,因为我不能在编写那些示 routine 序时使用自动补全或语法突出显示,这会使这个过程变得不愉快.让我澄清一下,这并不是世界末日,但有没有可能保留Visual Studio提供的所有好东西,而不进行编译?

(我查看了that question,但它不完全是我需要的,这个问题如果我理解被接受的答案适用于项目,我希望它适用于特定的文件.)

谢谢!

推荐答案

我可以重现你的情况:

enter image description here

这种情况源于您正在使用的功能:

Top level statement

这是从C#9开始的一项新功能.

你的解决方案让VS的智能感知消失的原因有两个:

1, First, the .cs file was not match the regularity of C# project.(In your situation, two .cs file used top level statement, which is incorrect usage.)

2, Second, in this situation, by setting the file as 100, you're essentially telling Visual Studio that this file is just content (like a text or data file) and not something it should provide C# Intellisense for.

我建议你使用公共程序的入口点而不是顶层语句,这样你就可以在编写代码时使用智能感知并且没有错误输出.

例如:

100

namespace ConsoleApp11
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Put the code here.
        }
    }
}

100

namespace ConsoleApp11.Samples 
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Put the code here.
        }
    }
}

请注意,在这种情况下,用法仍然不正确,因为有多个入口点,我们只是在写作时没有遇到问题.

如果你想运行应用程序,你仍然需要像这样排除.csproj文件中的文件:

  <ItemGroup>
    <Compile Remove="Samples\Program1.cs" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="Samples\Program1.cs" />
  </ItemGroup>

或使用C# preprocessor directives,例如:

#if NEVER_COMPILE
namespace ConsoleApp11.Samples
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Put the code here.
            Console.WriteLine("This is program1.");
        }
    }
}
#endif

在Visual Studio中,智能感知和编译器紧密集成在一起.Roslyn compiler是.NET编译器平台,负责编译代码和提供代码分析服务,这些服务支持智能感知等功能.VS的许多IntelliSense问题也将在此处报告:

https://github.com/dotnet/roslyn/issues

由于智能感知进程依赖于标记为要编译的文件列表,因此您必须做出 Select .如果通过某种方式将文件标记为编译,则会遇到错误输出.如果从编译中排除该文件,您将失go 大部分智能感知功能.

顺便说一下,您也可以遵循JonasH的建议,在这种情况下使用单元测试项目.那样会更合适.

Csharp相关问答推荐

C#中的包版本控制

CsWin32如何创建PWSTR的实例,例如GetWindowText

如何使用CsvReader获取给定列索引的列标题?

使用客户端密钥为Fabric Rest API生成令牌

无法解析数据库上下文的服务

安装附加的. exe与Visual Studio

Polly使用泛型重试和重试包装函数

C#.NET依赖项注入顺序澄清

为什么EventInfo.EventHandlerType返回可为空的Type值?

如何使用.NET6WPF打印车票?

.NET:从XPath定位原始XML文档中的 node

当使用Dapper映射DBNull时,我可以抛出异常吗?

如何防止Visual Studio断点以红色突出显示到整行?

VS 2022与VS 2019:如何/为什么创建额外的任务?

RX操作员使用先前值进行扫描,信号来自值本身

发布.NET 8 Blazor WebAssembly独立应用程序以进行静态站点部署

使用DI实例化带有动态参数的服务?

游戏对象走向不同的方向

无法创建&Quot;&Quot;类型的实例,因为无法将一个或多个参数绑定到

Avalonia MVVM数据模板