我正在使用此代码获得编译时类型转换错误... dunno如果我只是累了,但我无法弄清楚我需要在类中更改以解决此问题。任何指针都很棒,谢谢
错误是:“错误CS0266:无法隐式地将类型
csharpfinal.Packaging<string>
转换为csharpfinal.IGetValue<object>
。存在显式转换(您是否错过了演员?)”
interface ISetValue<T>
{
void SetData(T data);
}
interface IGetValue<T>
{
T GetData();
}
class Packaging<T> : ISetValue<T>, IGetValue<T>
{
private T storedData;
void ISetValue<T>.SetData(T data)
{
this.storedData = data;
}
T IGetValue<T>.GetData()
{
return this.storedData;
}
}
class Program
{
static void Main(string[] args)
{
Packaging<string> stringPackage = new Packaging<string>();
ISetValue<string> setStringValue = stringPackage;
setStringValue.SetData("Sample string");
// the line below causes a compile-time error
IGetValue<object> getObjectValue = stringPackage;
Console.WriteLine("{0}", getObjectValue.GetData());
}
}
答案 0 :(得分:2)
修改此代码
interface ISetValue<T>
{
void SetData(T data);
}
interface IGetValue<T>
{
T GetData();
}
到
interface ISetValue<in T>
{
void SetData(T data);
}
interface IGetValue<out T>
{
T GetData();
}
对于泛型类型参数,out关键字指定该类型 参数是协变的。您可以在泛型中使用out关键字 接口和代理。
协方差使您可以使用更多派生 类型比泛型参数指定的类型。这允许 实现变体接口和类的类的隐式转换 委托类型的隐式转换。协方差和逆变 支持引用类型,但不支持它们 价值类型。
答案 1 :(得分:0)
interface ISetValue<in T>
{
void SetData(T data);
}
interface IGetValue<out T>
{
T GetData();
}
class Packaging<T> : ISetValue<T>, IGetValue<T>
{
private T storedData;
void ISetValue<T>.SetData(T data)
{
this.storedData = data;
}
T IGetValue<T>.GetData()
{
return this.storedData;
}
}
class Program
{
static void Main(string[] args)
{
Packaging<string> stringPackage = new Packaging<string>();
ISetValue<string> setStringValue = stringPackage;
setStringValue.SetData("Sample string");
// the line below causes a compile-time error
IGetValue<object> getObjectValue = stringPackage;
Console.WriteLine("{0}", getObjectValue.GetData());
}
}
答案 2 :(得分:0)
Packaging<string> stringPackage = new Packaging<string>();
^泛型类型为string
IGetValue<object> getObjectValue = stringPackage;
但是您尝试将object
泛型转换为string
泛型,这就是您收到编译时错误的原因。
您可以将对象初始化的泛型类型更改为object
以修复它:
Packaging<object> stringPackage = new Packaging<object>();
ISetValue<object> setStringValue = stringPackage;
答案 3 :(得分:0)
IGetValue<object>
这应该是
IGetValue<string>