C# 无法传递符合泛型约束的类型的变量 公共接口i可移动,其中T:i可移动 { T-Care(T-T); } 公共课我:我爱 { 公共卫生保健(int i) { 返回i; } }
说我有上面的。现在,以下功能失败:C# 无法传递符合泛型约束的类型的变量 公共接口i可移动,其中T:i可移动 { T-Care(T-T); } 公共课我:我爱 { 公共卫生保健(int i) { 返回i; } },c#,generics,interface,generic-constraints,C#,Generics,Interface,Generic Constraints,说我有上面的。现在,以下功能失败: public interface ILovable<T> where T : IEquatable<T> { T Care(T t); } public class Me : ILovable<int> { public int Care(int i) { return i; } } private static void color(ILovable me)其中T:i可调
public interface ILovable<T> where T : IEquatable<T>
{
T Care(T t);
}
public class Me : ILovable<int>
{
public int Care(int i)
{
return i;
}
}
private static void color(ILovable me)其中T:i可调
{
var z=me.Care(1);//无法从'int'转换为'T'
}
上面的代码有什么地方不合格iLove
具有一个Care
功能,该功能包含一个T
,该功能是IEquatable
。在上面的函数中,我调用相同的Care
函数并传递T
,这是int
类型int
毕竟是IEquatable
我做错了什么?有什么办法可以修复它吗?我得到的错误是:
private static void Colour<T>(ILovable<T> me) where T : IEquatable<T>
{
var z = me.Care(1); //cannot convert from 'int' to 'T'
}
我很确定这是因为您将me
定义为iLove
。因此,它不会自动解析为Me
类型,其中int定义为t
这将修复错误,因为Me
将T
定义为int
:
Argument type 'int' is not assignable to parameter type 'T'
private static void color(Me-Me),其中T:i可满足
{
var z=我的关心(1);
}
您的方法签名没有指定iLoble
,而是指定了iLoble
。例如,这将起作用:
private static void Colour<T>(Me me) where T : IEquatable<T>
{
var z = me.Care(1);
}
private static void Colour(ILovable<int> me)
{
var z = me.Care(1); //cannot convert from 'int' to 'T'
}
这是因为方法color说会有类型为iloable
private static void Colour<T>(ILovable<T> me, T valueToCareAbout) where T : IEquatable<T>
{
var z = me.Care(valueToCareAbout);
}
//use like this
Colour(me, 1);
void color(我可以移动我)
或者直接传给我
void Colour<T>(ILovable<int> me)
无效颜色(Me)
因为除此之外,me.Care期望类型T不是int作为特定的更改如下
void Colour<T>(Me me)
private static void Colour<Int32>(ILovable<int> me)
要使上述工作正常,T
必须int
。为此,Colur方法语法应该如下
T t = (T)1; //This is the cause of error as int cannot be changed to T. Remember Int32 is sealed so T cannot derive from int
Care(t); // This is fine
现在若我们必须修正T,那个么问题就出现了,为什么在颜色定义中需要T
答案->用于在非密封类中不考虑继承类型。简短的答案是在泛型方法(或类)中使用更派生的类型重写类型T
的变量是不可能的,因为编译器不明确知道T
是更派生的类型(在我们的例子中,T
是int
),因为T
在运行时可以是任何其他派生类型
长回答:me
变量的类型为iLove
。现在,me.Care
函数需要在iLove
上指定的类型参数,即T
。在Care
功能之外T
可以是任何IEquatable
,因此int
是可以的。但是在函数内部,T
必须是T
,而不是另一种派生类型的IEquatable
。否则,对于以下情况,将出现运行时错误:
private static void Colour<string>(ILovable<string> me)
{
me.Care("Hello");
}
private static void color(ILovable me)其中T:i可调
{
var z=我的关心(1);
}
...
颜色(“”);
现在,调用color(“”
)时,T
是字符串。所以me
是i可移动的
。因此,me.Care
函数需要一个string
作为参数,但提供的是一个int
,这就是灾难
T t = (T)1; //This is the cause of error as int cannot be changed to T. Remember Int32 is sealed so T cannot derive from int
Care(t); // This is fine
private static void Colour<Int32>(ILovable<int> me)
private static void Colour<string>(ILovable<string> me)
{
me.Care("Hello");
}
private static void Colour<T>(ILovable<T> me) where T : IEquatable<T>
{
var z = me.Care(1);
}
...
Colour("");