C#编译时类型转换错误

时间:2014-12-10 07:01:42

标签: c#

我正在使用此代码获得编译时类型转换错误... 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());
     }
    }

4 个答案:

答案 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());
        }
    }

更多信息:http://msdn.microsoft.com/en-us/library/dd469487.aspx

答案 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>