gpt4 book ai didi

c# - HtmlHelper 不可分配给 HtmlHelper

转载 作者:行者123 更新时间:2023-11-30 21:23:59 26 4
gpt4 key购买 nike

我有意见

ViewUserControl<SearchViewData>

在哪里

SearchViewData: CommonViewData

在这个 View 中,我因此引用了 Html。
这是类型 HtmlHelper<SearchViewData>

我创建了一个名为 CommonHtmlHelper 的自定义 HtmlHelper 类(注意 HtmlHelper 参数的类型):

 public static SelectList TranslatedApplicationSelectList(this HtmlHelper<CommonViewData> htmlHelper, string selectedCode)

由于 SearchViewData 继承自 CommonViewData,而我的 Html 是 HtmlHelper 类型,因此它也是 HtmlHelper
然而,当我尝试访问 TranslatedApplicationSelectList 方法时,它在我的 View 中出现错误,提示 HtmlHelper 不可分配给 HtmlHelper

这是我的 OO 逻辑中的缺陷吗?这是 C# 如何处理泛型继承的限制吗(我想 Skeet 曾经向我解释过这个,但我找不到帖子了)?

最重要的是,我该如何修复它?

最佳答案

.NET 3.5 不处理 Covariance and Contravariance ,因此 .NET 3.5 中唯一兼容的泛型类型是具有完全相同类型的泛型类型。

为什么应该允许这样做的一个例子:

public class BaseType { }
public class DerivedType : BaseType { }

public void DumpList(List<BaseType> list)
{
foreach (var o in list)
Debug.WriteLine(o);
}

...
List<DerivedType> objects = new List<DerivedType>();
objects.Add(new DerivedType());
DumpList(objects);

这里我们只是从对象中转储内容(即读取),这应该是安全的。

一个更好的例子来说明为什么这是不允许的:

public class BaseType { }
public class DerivedType : BaseType { }

public void ManipulateList(List<BaseType> list)
{
list.Add(new BaseType());
}

...
List<DerivedType> objects = new List<DerivedType>();
objects.Add(new DerivedType());
ManipulateList(objects);

在这里,我们试图将 BaseType 的对象添加到已声明为存储 DerivedType 对象的列表中。这是不允许的。

由于编译器无法区分这两种情况,因此它们都是不允许的,因为上面的第二种情况。

在 .NET 4.0 和 C# 4.0 中,您可以应用额外的语法来指定允许您转换泛型类型的方向,具体取决于您打算对对象执行的操作。这可能允许两个示例中的第一个工作,但在 .NET 3.5 中,这是不可能的。第二个示例在 C# 4.0 中不起作用。

这是查理·卡尔弗特 (Charlie Calvert) 关于 Covariance and Contravariance in C# 4.0 的文章.

关于c# - HtmlHelper<ChildType> 不可分配给 HtmlHelper<MotherType>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1431636/

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