1

只是一个警告,这个问题需要安装 .NET 6 的预览版


我正在尝试在 C# 中创建一个接口,该接口可以允许+运算符类似于它在 Microsoft 的INumber<T>.

接口.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>
{

}

接口测试.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:接口“InterfaceTest.IExtendedArray”不能用作泛型类型或方法“IAdditionOperators<TSelf, TOther, TResult>”中的类型参数“TSelf”。约束接口 'System.IAdditionOperators<InterfaceTest.IExtendedArray, InterfaceTest.IExtendedArray, InterfaceTest.IExtendedArray>' 或其基接口具有静态抽象成员。

有没有办法通过自定义类型实现这一点?


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

4

1 回答 1

2

最后我能够重现您的问题 - 需要安装 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>
{

}
于 2021-09-19T13:08:21.177 回答