gpt4 book ai didi

C# 具有泛型类型的泛型对象实例化

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

我正在处理一个通用委托(delegate)函数并声明一个类型为 List 的返回类型。

public static List<T> PerformOperationOnGenericArray<T>(IList<T> myList,
FunctionForGenericArray<T> operation)

我是否可以使用泛型返回类型而不是同样指定泛型类型的 List,即 S

public static S<T> PerformOperationOnGenericArray<T, S>(IList<T> myList, 
FunctionForGenericArray<T> operation)

我猜这是不可能的,但我看不出为什么不这样做的原因。当我指定时,编译器肯定知道类型:

PerformOperationOnGenericArray<int, List<string>>(myInts, i => i.Equals(12));

这可能是我需要考虑使用动态类型的情况吗?

最佳答案

您不能将开放泛型类型用作泛型类型参数,但是,您可以使用特定类型 S<T>作为参数:

public static R PerformOperationOnGenericArray<T,R>
(IList<T> myList, FunctionForGenericArray<T> operation)
where R : S<T>

在你的例子中,如果类型 S在编译时是完全定义的(封闭类型),您甚至不需要这样做:

public static S<T> PerformOperationOnGenericArray<T>
(IList<T> myList, FunctionForGenericArray<T> operation)

应该足够了。

如果S,您只需要使用第一种形式本身会有所不同。那我这是什么意思。让我们看一个例子。如果你有:

class Foo<T> { }

你可以这样写:

public static Foo<T> PerformOperationOnGenericArray<T>
(IList<T> myList, FunctionForGenericArray<T> operation)

但是,如果您有一组相关的泛型类型:

class Foo<T> { }
class Bar<T> : Foo<T> { }
class Baz<T> : Foo<T> { }

并且您希望允许调用者指定使用哪一个,那么您需要将返回类型作为方法的通用签名的一部分:

public static R PerformOperationOnGenericArray<T,R>
(IList<T> myList, FunctionForGenericArray<T> operation)
where R : Foo<T>

调用者现在需要指定 R 的类型明确地:

PerformOperationOnGenericArray<T,Bar<T>>( ... )

如果你想允许接受单个参数的任何泛型类型,那你就不走运了。类型系统不提供表达限制的方法:

allow any generic type that allows a single parameter, and enforce that parameter to be a T

你能做的最好的事情就是定义一个所有已知类型都符合的众所周知的接口(interface)(比如 IEnumerable<T> ,或者你自己制作的接口(interface)),并将其用作通用约束的一部分:

public static R PerformOperationOnGenericArray<T,R>
(IList<T> myList, FunctionForGenericArray<T> operation)
where R : IEnumerable<T>

但是,在这种情况下,提供的类型必须全部实现此接口(interface)。如果您正在寻找前者(您可以在其中指定任何类型,只需匹配类型参数的数量),您正在寻找通用 duck typing (1) - C# 不支持。

对此有一个有趣的旁注。创建一个泛型方法,其类型不能由编译器仅从方法的形式参数推断出来,这是要尽量避免的事情。当无法推断出参数时,调用者将被迫指定所有类型参数 - 这会导致困惑和冗长的代码。虽然有时确实会出现这些情况,但您最好尽可能避免它们。

(1) - 如果类型的顺序、类型和名称匹配,C# 确实支持单个程序集中匿名类型的鸭子类型成员 - 编译器将假定它们是同一类型。

关于C# 具有泛型类型的泛型对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3558405/

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