为接口添加操作符支持(. net 6的预览特性)



只是一个警告,这个问题需要安装。net 6预览版


我正在尝试在c#中创建一个接口,可以允许+操作符类似于在微软的INumber<T>中实现的方式。

Interfaces.cs

using System;
using System.Runtime.Versioning;
namespace InterfaceTest;
[RequiresPreviewFeatures]
public interface IExtendedArray<T> : IAdditionOperators<IExtendedArray<T>, IExtendedArray<T>, IExtendedArray<T>>
where T : INumber<T>
{
Array Data { get; }
}
[RequiresPreviewFeatures]
public interface IExtendedFloatingPointArray<T> : IExtendedArray<T>
where T : IFloatingPoint<T>
{
}

InterfaceTest.csproj

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>false</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Runtime.Experimental" Version="6.0.0-preview.7.21377.19" />
</ItemGroup>
</Project>
然而,这段代码产生了

错误CS8920: The interface 'InterfaceTest. s。iextendearray '不能用作泛型类型或方法'IAdditionOperators<TSelf,>'中的类型参数'TSelf'。约束接口system . iadditionoperators&interfacetest。IExtendedArray InterfaceTest。IExtendedArray, InterfaceTest.IExtendedArray>'或其基接口具有静态抽象成员。

是否有一种方法实现这与自定义类型?


dotnet --list-sdks显示我已经安装了6.0.100-rc.1.21458.32。但是我刚刚通过Visual Studio 2022 Preview 4安装了它。

最后我能够重现您的问题-需要安装VS 2022预览(2019版本编译的代码很好,但在运行时失败)或从终端使用dotnet build

如果你想做与INumber类似的事情,你需要遵循与TSelf类型引用相同的模式(如果我没有弄错的话,它被称为奇怪的循环模板模式):

[RequiresPreviewFeatures]
public interface IExtendedArray<TSelf, T> : IAdditionOperators<TSelf, TSelf, TSelf> where TSelf : IExtendedArray<TSelf, T> where T : INumber<T>
{
T[] Data { get; }
}

[RequiresPreviewFeatures]
public interface IExtendedFloatingPointArray<TSelf, T> : IExtendedArray<TSelf, T>
where TSelf : IExtendedFloatingPointArray<TSelf, T>
where T : IFloatingPoint<T>
{
}

相关内容

  • 没有找到相关文章

最新更新