gpt4 book ai didi

C#继承开放泛型编译

转载 作者:行者123 更新时间:2023-11-30 18:25:35 24 4
gpt4 key购买 nike

今天我的脑子坏了,我想不出一个干净的方法来强制编译器使用继承进行泛型推理。

想象以下 4 个类

模型

public abstract class Model
{

}

public class CodePerfModel : Model
{

}

实体

public abstract class ModelEntity<TModel> where TModel : Model
{
public TModel Model { get; set; }

}

public class CodePerfEntity : ModelEntity<CodePerfModel>
{

}

现在对我来说,逻辑上我应该理所当然地认为当我继承自 ModelEntity<> 的东西时(它将通过继承指定 TModel 的类型),因为任何继承自 ModelEntity<> 的类必须指定它。

有没有办法强制编译器为我解决这个问题?

例如

如果我现在想使用 ModelEntity<> ,我必须为它指定一个类型。比如下面的:

public class CallerClass<TEntity, TModel>
where TEntity : ModelEntity<TModel>
where TModel : Model
{

}

我怎样才能去掉 TModel争论无处不在?在编译时仍然可以访问 TModel 类型?例如。通过基地 Model属性(property)。

对我来说,像下面这样:

public class CallerClass<TEntity>
where TEntity : ModelEntity<>
{

}

这很有意义,因为在调用它时我应该指定的是例如

SomeCall<CodePerfEntity>();

而不是

SomeCall<CodePerfEntity, CodePerfModel>();

这是目前可能的事情吗?

这是否值得为 C# 6/7 提出?

最佳答案

您提到您希望在编译时访问 TModel,但在派生类时未明确指定此类型。放弃您的示例,转向更一般的情况,这意味着您希望语义保持不变,但是您不希望在声明泛型约束时显式声明类型参数自己的类型参数。

本质上,您是在问为什么没有实现特定的语法糖功能。

让我们考虑另一个例子:

public class CallerX<A, B> where A : ModelEntity<> where B : ModelEntity<>

根据您问题中的示例,编译器应插入 TModel'1TModel'2 作为 A 的类型参数>B 分别。假设该功能已实现。这意味着我们已经创建了默认情况,即 TModel'1TModel'2 是不同的类型,每个都有匹配单一类型的约束。如果我想向 TModel'1TModel'2 添加更多约束,或者强制它们为同一类型怎么办?为什么这种情况如此特殊以至于它应该有自己的语法?

据我所知,C# 团队的政策是每个新功能都以“-100 分”开头,并且应该非常好才能被考虑(请参阅 UserVoice 了解 C#)。

总结:

  • 新的语言功能成本高昂且增加了复杂性。
  • 您要求的隐式语法在大多数情况下不太可能/不清楚它是否是理想情况。
  • 开发人员必须学习并理解,作为类型参数约束的开放泛型类型将插入一个隐藏的匿名额外参数。对我来说,在我没有声明的情况下将一些其他类型参数添加到我的类型中是不直观的。

关于C#继承开放泛型编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29931043/

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