C#继承Open Generics Compile

时间:2015-04-28 22:26:45

标签: c# generics types compilation open-generics

今天我的大脑已经死了,我无法找到一种强制编译器使用继承进行通用推理的简洁方法。

想象一下以下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的类型),因为任何继承自{{1的类必须指定它。

反正是否迫使编译器为我解决这个问题?

E.g。

如果我目前想要使用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>();

这是目前可能的吗?

C#6/7值得提高吗?

1 个答案:

答案 0 :(得分: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#)。

总结:

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