C# 具有一般约束的对象与对象之间的差异对象与类
当我有约束时,我试图弄清楚如何从C# 具有一般约束的对象与对象之间的差异对象与类,c#,generics,C#,Generics,当我有约束时,我试图弄清楚如何从Converter转换到Converter,其中T:object。通过将约束更改为,其中T:class,解决了这个问题,但我不完全确定为什么会这样 这不会编译: public void Foo<T>(Converter<string, T> x) where T : object { Converter<string, object> y = x; } Error: Cannot implicitly convert
Converter
转换到Converter
,其中T:object。通过将约束更改为,其中T:class
,解决了这个问题,但我不完全确定为什么会这样
这不会编译:
public void Foo<T>(Converter<string, T> x) where T : object
{
Converter<string, object> y = x;
}
Error: Cannot implicitly convert type 'System.Converter<string,T>' to 'System.Converter<string,object>'
public void Foo(转换器x),其中T:object
{
转换器y=x;
}
错误:无法将类型“System.Converter”隐式转换为“System.Converter”
然而,以下情况确实如此,这是为什么
public void Foo<T>(Converter<string, T> x) where T : class
{
Converter<string, object> y = x;
}
public void Foo(转换器x),其中T:class
{
转换器y=x;
}
没有像:object
这样的通用约束。第一个示例有两个错误:
错误1约束不能是特殊类“对象”
然后:
错误2无法将类型“System.Converter”隐式转换为“System.Converter”
那么,简单地说,由于没有有效的约束,无法将not constraintSystem.CONVERT
转换为Converter
第二个例子有一个有效的约束
T
是引用类型,可以强制转换为对象,因为它是类型层次结构的根。对象
比类
更通用<代码>对象
包括所有对象类型,包括装箱值类型<代码>类仅将其限制为引用类型。不确定对象
作为约束是否真的意味着什么,因为它本质上意味着您将约束它“但不是真的!”@Magus一个装箱的值类型将满足类
约束。满足对象
约束的任何东西都不满足类
约束。@Servy:可能除了有效语法之外。如果它是有效的,值类型将只是自动装箱,而类约束专门限制它。@Magus它不明确对象约束的实际含义,这就是它被禁止的原因。正如您所描述的那样,它可以自动框选任何值类型;在这种情况下,这种约束可能应该完全忽略。这可能意味着值类型在传入之前必须已经装箱(在这种情况下,它的功能与类
约束相同)。“后一个”选项是唯一值得使用的选项,但由于它的含义不明确,他们添加了一个特殊的关键字class
,以供使用,特别是为了清楚起见。@Servy:这正是我的观点,但与你的前一点不一致。显然,由于对象
不明确,而类
不明确,你不能说它们直接映射。是的,不确定我怎么没有发现其他错误:p谢谢,我会在可能的时候接受