gpt4 book ai didi

c# - 方法的类型推断,具有泛型和类继承

转载 作者:太空狗 更新时间:2023-10-30 01:08:59 28 4
gpt4 key购买 nike

我有一个如下所示的类层次结构:

class Base<TElement>
{
public TElement Element { get; set; }
}

class Concrete : Base<string>
{
}

我想写一个接受 Base 子类的方法:

public TConcrete DoSomething<TConcrete, TElement>()
where TConcrete : Base<TElement>
{
}

有没有什么方法可以定义 DoSomething,而不必定义 TElement

理想的解决方案是,如果编译器可以自动生成 TElement,那么调用代码将如下所示:

var item = DoSomething<Concrete>();

我正在使用 C# 4.0。

最佳答案

这是不可能的,原因如下:

  1. 从 C# 4 开始,类型推断是“全有或全无”——编译器无法推断出一些泛型参数,但不能推断出其他参数。
  2. 从 C# 4 开始,无法指定通用“通配符”,例如 where TConcrete : Base<???> .

这里有一些解决方法。

非通用基类型:创建通用的基类或接口(interface)类型。这是一种常见的模式;例如IEnumerable<T> : IEnumerable .


协变接口(interface):使用 C# 4 泛型接口(interface)协变,您可以创建一个类型安全的解决方案,不需要用“丑陋的”非泛型成员来混淆您的类型:

public interface IBase<out TElement>
{
TElement Element { get; }
}

class Base<TElement> : IBase<TElement>
{
public TElement Element { get; set; }
}

class Concrete : Base<string> { }

然后:

// Won't work with value types.
public TConcrete DoSomething<TConcrete>()
where TConcrete : IBase<object> { }

然后这样调用它:

var item = DoSomething<Concrete>();

关于c# - 方法的类型推断,具有泛型和类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7981630/

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