2014-12-10 4 views
0

Я получаю ошибку преобразования типа компиляции с этим кодом ... dunno, если я просто устал, но я не могу понять, что мне нужно изменить в класс, чтобы исправить это. Все указатели было бы удивительным, благодаряОшибка преобразования типа компиляции C#

Ошибка: «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()); 
    } 
    } 
+1

Вы пробовали 'IGetValue getObjectValue = stringPackage; ' –

+0

Является ли мой код неправильным? – dotnetstep

+0

пытался это сделать без изменения Robpaulsen

ответ

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 в общих интерфейсах и делегатах .

Covariance позволяет использовать более производный тип , чем тот, который указан общим параметром. Это позволяет использовать неявное преобразование классов, которые реализуют варианты интерфейсов, и неявное преобразование типов делегатов. Ковариация и контравариантность поддерживаются для ссылочных типов, но они не поддерживаются для типов значений .

+1

Должно ли это не быть 'ISetValue '? – leppie

+0

мой плохой, просто скопируйте его с IGetValue: D, спасибо – DevEstacion

+0

Эй, я не уверен, вот почему я спросил: p – leppie

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

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; 
+0

Да, я пытался это сделать, не меняя , должен был быть более ясным. Спасибо, хотя – Robpaulsen

0
IGetValue<object> 

Если это будет

IGetValue<string>