gpt4 book ai didi

c# - 将类型参数限制为基本类型

转载 作者:太空狗 更新时间:2023-10-29 18:27:07 24 4
gpt4 key购买 nike

我知道如何强制类型参数成为另一种类型的子类型:

public interface IMapping<T2> 
{
public void Serialize<T3>(T3 obj)
where T3 : T2;
}
...

var mapping = MapManager.Find<Truck>();
mapping.Serialize(new TonkaTruck());

有没有办法强制类型参数成为另一种类型的父类(super class)型

public interface IMapping<T2>
{
public void IncludeMappingOf<T1>()
where T2 : T1; // <== doesn't work
}
...

var mapping = MapManager.Find<Truck>();

// Truck inherits Vehicle
// Would like compiler safety here:
mapping.IncludeMappingOf<Vehicle>();

mapping.Serialize(new TonkaTruck());

目前,我必须在运行时使用 IncludeMappingOf 中的 IsSubclassOf 比较 T1 和 T2。编译安全的解决方案将是更可取的。有什么想法吗?

编辑:更改示例以减少设计气味。

注意:链接的问题非常相似,但没有给出合适的答案。希望这个问题也能对那个问题有所启发。

编辑#2:

更简单的例子:

public class Holder<T2>
{
public T2 Data { get; set; }

public void AddDataTo<T1>(ICollection<T1> coll)
//where T2 : T1 // <== doesn't work
{
coll.Add(Data); // error
}
}

...
var holder = new Holder<Truck> { Data = new TonkaTruck() };
var list = new List<Vehicle>();
holder.AddDataTo(list);

编译器:参数类型“T2”不可分配给参数类型“T1”。 是的,我知道,我正试图让编译器只允许 T2 可分配给参数类型 T1 的情况!

最佳答案

虽然 w0lf 的回答给出了直接的解决方案,但我想给出一些背景解释。

当你写类似的东西时

class C<A> where A : B

void F<A>() where A : B

A : B 形式的约束必须将 A 作为正在声明的类、接口(interface)、方法等的泛型类型参数之一。

您遇到的错误不是,因为您将当前声明的泛型类型参数放在了冒号的右侧(这是合法的)——这是因为您已经放置了一个泛型冒号左侧的外部声明(不是当前声明)的类型参数。

如果要在某些声明上形成约束 A : B,则必须在该声明和 A 的范围内引入 A必须小于或等于 B 的范围。这是一个实用的语言限制的原因是,对于任何泛型类型参数 T,它将关于类型 T 的约束的任何推理隔离到单个声明,其中 正在引入 T

关于c# - 将类型参数限制为基本类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18596387/

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