Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#8.0不可空类型兼容经典NetFramework(4.X)_C#_.net 4.0_Non Nullable - Fatal编程技术网

C#8.0不可空类型兼容经典NetFramework(4.X)

C#8.0不可空类型兼容经典NetFramework(4.X),c#,.net-4.0,non-nullable,C#,.net 4.0,Non Nullable,我正在启动一个新项目,使用Blazor Asp.NET Core 3.1和所有酷炫的新玩意儿。但是对于客户端的一个接口,我仍然需要一个支持WCF的解决方案,从而支持NetFramework4.8 因此,如果我将我的api项目(到目前为止,net标准2.0)设置为net标准2.1,我会得到一个错误,即net Framework不支持netstandard 2.1 问题1:有没有办法在net framework中仍然支持可为空的类型?(或者是一种在NetCore中支持wcf的可行方式——我需要wcf

我正在启动一个新项目,使用Blazor Asp.NET Core 3.1和所有酷炫的新玩意儿。但是对于客户端的一个接口,我仍然需要一个支持WCF的解决方案,从而支持NetFramework4.8

因此,如果我将我的api项目(到目前为止,net标准2.0)设置为net标准2.1,我会得到一个错误,即net Framework不支持netstandard 2.1

问题1:有没有办法在net framework中仍然支持可为空的类型?(或者是一种在NetCore中支持wcf的可行方式——我需要wcf,因为我需要一个库) 问题2:如果不是:除了新的net standard 2.1项目之外,我是否可以创建第二个net standard 2.0项目,该项目仍然支持旧的net Framework,并将不可为空的类型编译到可由net Framework加载的程序集?然后,我可以使用不可为空的库all netcore项目和网络标准2.0版本来提供我的WCF服务


问题3:一些更好的想法?

编辑:感谢@JohnSkeet指出了一个更简单的解决方案:

在您的网络标准库的csproj中,将TargetFramework替换为TargetFrameworks

<TargetFrameworks>net461;netstandard2.1</TargetFrameworks>
net461;netstandard2.1
信息:Net461是第一个支持Net标准2.0库的netFramework版本

如果您需要NetFramework或netcore特定的引用,您可以像他指出的那样在csproj文件中使用MS构建操作


如果您死气沉沉,那么下面使用我的旧解决方案的唯一原因是您只想使用Visual Studio UI,而不想使用文本编辑器修改csproj以用于自定义引用或NuGetPackages

谢谢,迈克尔

旧解决方案

你好,我想我找到了解决问题的方法:

  • 创建名为MyLibrary.Api的共享项目 (同一文件夹中的.NET标准2.0和.NET标准2.1项目之后的共享项目会导致错误)
  • 此外,共享项目应具有根命名空间的名称,因为共享项目不能具有默认命名空间,并且所有新文件都将项目名称作为命名空间

  • 添加.Net标准类库MyLibrary.Api.Core,并将其目标更改为中的Net标准2.1(用于.Net核心项目)

  • 在addreference->sharedprojects下引用MyLibary.Api,现在在编译时,共享项目的所有文件都会编译到MyLibrary.Api.Core中

  • 添加.Net标准类库MyLibrary.Api.NetFramework,将其保留在目标Net标准2.0中(这适用于Net框架项目

  • 还添加对MyLibrary.Api共享项目的引用
  • 将最新版本的Microsoft.Net.Compilers NuGet软件包添加到NetFramework项目中
用于测试:

  • 添加NetCore控制台项目MyLibrary.Console.Core并参考MyLibrary.Api.Core
  • 添加netFramework控制台项目MyLibrary.Console.netFramework并参考MyLibrary.Api.netFramework。将.NET Framework版本至少设置为4.6.1,因为较低版本不支持.NET标准2.0项目
现在激活C#8.0

现在,在.csproj文件中的所有项目(MyLibrary.Api共享项目除外)中,将添加到第一个属性组LangVersion和Nullable(Nullable不是必需的,它只是在默认情况下打开Nullable类型,如果不添加它,则需要在每个代码文件中添加启用了#Nullable):


8
使可能
...
在.NETFramework项目中,我使用LangVersion添加了一个新的PropertyGroup部分,但我认为这不是必需的

希望这也能帮助别人

我的解决方案适用于那些希望在其.net核心项目中使用NetStandard 2.1优点,但仍希望在.net Framework中使用该库的一个版本,甚至可以在.net Framework中使用可空类型的人


同样,通过这种方式,您可以编译两个DLL。一个用于NetFramework,另一个用于NetStandard 2.1中的.NET Core

我认为您可以在.NET Framework项目的csproj文件中添加一个标记,并将其设置为“8.0”。要启用可为null的类型,您还必须添加标记并将其设置为“enable”。不过,这只有在使用Visual Studio 2019时才能起作用(不确定是哪个专用版本),您将无法使用C#8中的全套更改。(例如,默认接口实现将不起作用)。谢谢GSerg,事先没有找到帖子。我的解决方案有点不同,所以我在下面发布了答案。看起来你把这个问题弄得比你需要的复杂得多。你可以使用
net40;netstandard2.1
创建一个类库,将LangVersion设置为8.0并启用可为空的引用类型。但是当我只创建一个项目时我无法分别添加对NetStandard 2.0和2.1项目的单独引用?例如,仅针对Net Standard 2.0项目对Microsoft.Net.Compilers的引用?您可以在MSBuild文件中使用条件-请参阅,例如。谢谢。因此,要么是两个2类项目和一个共享项目,要么是在.csproj文件中使用MSBuild。I我将要迁移我的大项目,但同时遇到以下错误:包Microsoft.EntityFrameworkCore 3.0.0-preview5.19227.1与net40不兼容(.NETFramework,版本=v4.0)。在那里,我首先遵循了目标框架方法,可以决定是使用MSBuild还是3个项目。您已经在使用MSBuild。csproj文件是MSBuild文件。我并不是建议在项目文件中使用任何不寻常的内容—只是在引用中添加一个条件。不需要额外的库或类似的内容。
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System.Net.Http" />
</ItemGroup>
  <PropertyGroup>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
    ...