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的参数,而T稍后会被解析,所以在编译时我要么告诉方法T是int类型

因此,要么将iLove作为参数传递,要么将T设为int

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("");