gpt4 book ai didi

C# 接口(interface)中的多级泛型类型

转载 作者:行者123 更新时间:2023-11-30 20:47:26 25 4
gpt4 key购买 nike

说我有以下接口(interface)

using System;

public interface IInput
{

}

public interface IOutput<Shipper> where Shipper : IShipper
{

}

public interface IShipper
{

}


public interface IProvider<TInput, TOutput>
where TInput : IInput
where TOutput : IOutput<IShipper>
{

}

我能够创建以下类:

public class Input : IInput
{

}

public class Shipper : IShipper
{

}

public class Output : IOutput<Shipper>
{

}

我尝试了多种方法来创建一个实现 IProvider 的类,但没有成功?

例如:

public class Provider : IProvider<Input, Output>
{

}
Error: The type 'Output' cannot be used as type parameter 'TOutput' in the generic type or method 'IProvider<TInput,TOutput>'. There is no implicit reference conversion from 'Output' to 'IOutput<IShipper>'

public class Provider : IProvider<Input, Output<IShipper>>
{

}
Error: The non-generic type 'Output' cannot be used with type arguments

我该怎么做?

最佳答案

您正在尝试将 IOutput 中的通用参数 Shopper 视为协变的。您需要在声明接口(interface)时明确声明该泛型参数是协变的:

public interface IOutput<out Shipper> where Shipper : IShipper
{

}

(注意 out 关键字。)

然后代码编译。

请注意,进行此更改后,您将无法再使用泛型类型参数 Shipper 作为该接口(interface)任何成员的参数;如果它会在这样的庄园中使用,那么接口(interface)在概念上就不会是协变的。

您实际上可以稍微简化代码以删除一些与此问题无关的问题。这一切都归结为能够执行以下操作:

IOutput<Shipper> output = new Output();
IOutput<IShpper> = output;

仅当 IOutput 与其通用参数相关时,该转换才有效。

关于C# 接口(interface)中的多级泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25813615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com