C#继承开放泛型编译

3
今天我的思维僵化了,无法想出一种干净的方式来强制编译器使用继承实现泛型推断。
想象一下以下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属性访问。以下类似代码是否可行:
public class CallerClass<TEntity>
    where TEntity : ModelEntity<>
{

}

当调用它时,只需指定例如即可,这将是完美的解释。
SomeCall<CodePerfEntity>();

不是...而是...
SomeCall<CodePerfEntity, CodePerfModel>();

这是目前是否可行的事情?

对于C# 6/7来说,这是否值得提出?


现在就我而言,从逻辑上讲,当我通过继承获取从ModelEntity<>继承的某些内容时,因为任何从ModelEntity<>继承的类都必须指定它,所以我应该认为它将指定TModel类型。 - Blorgbeard
2
啊,我们开始吧。重复:为什么泛型类型约束不能继承/层次强制执行 - Nathan Cooper
1
@spender 我来自英国(至少从5岁开始)。说实话,我并不认为那个词是冒犯性的,但这可能只是因为我的朋友圈子。但我能理解你的想法,所以我已经改了。 - Michal Ciechan
1
@MichalCiechan 我也是,而且,是的,我也和不良公司为伍 ;) 但有些人确实会因此而感到不安。 - spender
1
@spender 哈哈 @ 这个链接笑死我了 - Michal Ciechan
显示剩余7条评论
1个回答

0

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

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

让我们考虑另一个例子:

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

从你问题中的示例来看,编译器应该将TModel'1TModel'2分别插入到AB的类型参数中。假设该特性已经实现。这意味着我们已经创建了默认情况,即TModel'1TModel'2是不同的类型,每个类型都具有与单个类型匹配的约束条件。 如果我想要向TModel'1TModel'2添加更多约束条件,或者强制它们成为相同的类型,怎么办?为什么这种情况如此特殊,需要自己的语法?
据我所知,C#团队的政策是,每个新功能都从“-100分”开始,并且必须非常出色才能被考虑(请参见UserVoice的C#)。
总之:
  • 新语言特性往往会增加复杂度和成本。
  • 你在要求一种隐式语法,但很可能/不清楚这将是大多数情况下所需的情况。
  • 开发人员必须学习和理解,一个公共泛型类型作为类型参数限制将会插入一个隐含和匿名的额外参数。对我来说,没有声明它就添加了另外一个类型参数并不直观。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接