只是一个警告,这个问题需要安装。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>
{
}