Словарь - унаследованные классы - PullRequest
0 голосов
/ 20 октября 2018

У меня есть (надеюсь) простой вопрос:

У меня есть несколько классов:

class Foo
class Foo1 : Foo
class Foo2 : Foo

У меня есть два словаря:

Dictionary<int, Foo1> dic1 

Dictionary<int, Foo2> dic2

И у меня естьметод:

private static int Method(Dictionary<int, Foo>)

и вызов метода:

Method(dic1);

, но теперь я получаю ошибку, которую не могу преобразовать Dictionary<int, Foo1> в Dictionary<int, Foo>.

Как мне решить эту проблему?

Спасибо :)) 1021 *

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Помимо ограничения типа словаря, есть две функции для поддержки этого: ковариантность и контравариантность.

Они позволяют обрабатывать коллекцию более / менее производного типа, как один из другого типа.Таким образом, Foo1[] можно присвоить Foo[], точно так же, как вы назначите Foo1 переменной Foo.

Вот вся неофициальная статья о материале: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/covariance-contravariance/

0 голосов
/ 20 октября 2018

Обобщения, с ограничением Foo должны это сделать

public class Foo { }
public class Foo1 : Foo { }
public class Foo2 : Foo { }

public class SomeClass
{    
   public static int Method<T>(Dictionary<int, T> dict) where T : Foo
   {
      ...
   }
}

Дополнительные ресурсы

Ограничения на параметры типа (C #Руководство по программированию)

Ограничения информируют компилятор о возможностях, которые должен иметь аргумент типа.Без каких-либо ограничений аргумент типа может быть любого типа.Компилятор может принимать только члены Object, который является базовым базовым классом для любого типа .NET.

...

Ограничивая параметр типа, вы увеличиваете количество допустимых операций.и вызовы методов для тех, которые поддерживаются ограничивающим типом и всеми типами в его иерархии наследования.Когда вы разрабатываете универсальные классы или методы, если вы будете выполнять какие-либо операции с универсальными элементами, помимо простого присваивания, или вызывать любые методы, не поддерживаемые System.Object, вам придется применить ограничения к параметру типа.

...

Например, ограничение базового класса сообщает компилятору, что только объекты этого типа или производные от этого типа будут использоваться в качестве аргументов типа.Как только у компилятора есть такая гарантия, он может разрешить вызов методов этого типа в универсальном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...