Можно ли кастить template<A> к template<B> если B родитель A?

336
12 августа 2017, 00:47

Есть базовый класс и у него есть наследник. И есть дженерик ограниченный базовым классом. Также есть интерфейсы реализуемые двумя разными классами. Во время реализации второго интерфейса в строчке:

    return BuilderResource.GetPath( LoadedResources );

Происходит ошибка:

Compilation error (line 47, col 35): Argument 1: cannot convert from 'ResourceReference' to 'ResourceReference'

Что нужно сделать чтобы он нормально конвертировал? Задача не исправить тип в BuilderInfo а именно конвертировать.

using System;
public class Program
{
    public static void Main()
    {
        var a = new BuilderComponent<string>("Hi!");
        a.Write();
    }
}
public class GameComponent { }
public class SceneObject : GameComponent { }
public class ResourceReference<T> where T : GameComponent {}
public interface IBuilderResource {  ResourceReference<GameComponent> GetPath ( ResourceReference<GameComponent> res);  }
public class BuilderComponent<T> : IBuilderResource{
    T str;
    public BuilderComponent(T str) { this.str = str;    }
    public void Write()  { Console.WriteLine(str);  }
    public ResourceReference<GameComponent> GetPath ( ResourceReference<GameComponent> res) { return res;   }
}

public interface IBuilderViewInfo { ResourceReference<SceneObject> GetPath(); }
public class BuilderInfo : IBuilderViewInfo {
    protected readonly ResourceReference<SceneObject> LoadedResources;
    protected readonly IBuilderResource BuilderResource;
    public BuilderInfo( ResourceReference<SceneObject> loadedResources, IBuilderResource builderResource)
    {
        LoadedResources = loadedResources;
        BuilderResource = builderResource;
    }
    public ResourceReference<SceneObject> GetPath()  {  
        return BuilderResource.GetPath( LoadedResources );  
    }
}

Для эксперимента тестовый образец: https://dotnetfiddle.net/oCqSlq

READ ALSO
Поблочное считывание файла

Поблочное считывание файла

Дорогие друзья, хочу реализовать шифрование некоторых файлов на языке с# Проблема заключается в том, что ключ имеет длину 64 байта, и мне соответственно...

325
Fluent API связь один к одному

Fluent API связь один к одному

Не получается сделать связь один к одному, ошибка :

318
C#. Как отследить использование диска?

C#. Как отследить использование диска?

В диспетчере задач, во вкладке производительность можно нажать на "Диск 0 (c:)"Как получить переменную с его активным временем в процентах?

192
В textbox нет invoke, что делать?

В textbox нет invoke, что делать?

Почему Invoke не идёт в комплект textbox и что можно придумать?

292