Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有一般约束的对象与对象之间的差异对象与类_C#_Generics - Fatal编程技术网

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 constraint
System.CONVERT
转换为
Converter


第二个例子有一个有效的约束
T
是引用类型,可以强制转换为
对象,因为它是类型层次结构的根。

对象
更通用<代码>对象
包括所有对象类型,包括装箱值类型<代码>类仅将其限制为引用类型。不确定
对象
作为约束是否真的意味着什么,因为它本质上意味着您将约束它“但不是真的!”@Magus一个装箱的值类型将满足
约束。满足
对象
约束的任何东西都不满足
约束。@Servy:可能除了有效语法之外。如果它是有效的,值类型将只是自动装箱,而类约束专门限制它。@Magus它不明确
对象
约束的实际含义,这就是它被禁止的原因。正如您所描述的那样,它可以自动框选任何值类型;在这种情况下,这种约束可能应该完全忽略。这可能意味着值类型在传入之前必须已经装箱(在这种情况下,它的功能与
约束相同)。“后一个”选项是唯一值得使用的选项,但由于它的含义不明确,他们添加了一个特殊的关键字
class
,以供使用,特别是为了清楚起见。@Servy:这正是我的观点,但与你的前一点不一致。显然,由于
对象
不明确,而
不明确,你不能说它们直接映射。是的,不确定我怎么没有发现其他错误:p谢谢,我会在可能的时候接受