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 提出?

4

1 回答 1

0

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

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

让我们考虑另一个例子:

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

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

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

总结一下:

  • 新的语言特性很昂贵并且增加了复杂性。
  • 您正在要求一种隐式语法,在大多数情况下,它不太可能/不清楚这将是所需的情况。
  • 开发人员必须了解并理解,作为类型参数约束的开放泛型类型将插入隐藏的匿名额外参数。对我来说,在我没有声明的情况下将其他类型参数添加到我的类型中是不直观的。
于 2015-04-29T00:11:05.373 回答