Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 协变接口与具有通用参数的方法的优势_C#_Covariance - Fatal编程技术网

C# 协变接口与具有通用参数的方法的优势

C# 协变接口与具有通用参数的方法的优势,c#,covariance,C#,Covariance,我试图通过以下方式为字典构建一个协变的IEnumerable public interface ICovariantKeyValuePair<K, out V> { K Key { get; } V Value { get; } } 公共接口ICovariantKeyValuePair { K键{get;} V值{get;} } 因为我只想使用一种方法来处理具有某种公共值类型的不同类型的字典。最后,我真的很惊讶,因为我忽略了使用通用方法的非常简单的解决方案 public

我试图通过以下方式为字典构建一个协变的
IEnumerable

public interface ICovariantKeyValuePair<K, out V>
{
  K Key { get; }
  V Value { get; }
}
公共接口ICovariantKeyValuePair
{
K键{get;}
V值{get;}
}
因为我只想使用一种方法来处理具有某种公共值类型的不同类型的字典。最后,我真的很惊讶,因为我忽略了使用通用方法的非常简单的解决方案

public void Print<S,T>(Dictionary<S,T> dict) { ... }
公共作废打印(字典目录){…}
现在我想知道协变接口的真正好处是什么,一个人只能用这些接口而不能用其他方法做什么

编辑我明白,如果我想将两个值保持在一起,就像上面描述的协变键值对一样,这是有意义的。Heinzi的以下示例(见下文)

var kv1=新的协方差KeyValuePair(“MyDog”,MyDog);
var kv2=新的协方差KeyValuePair(“MyCat”,MyCat);
ICovariantKeyValuePair[]myAnimals={kv1,kv2};
显然,它只适用于协变接口。但是为了达到中心点,让我们进一步简化它:我会写

Dog d = new Dog();
Cat c = new Cat();
List<Animal> l = new List<Animal>() { d, c };
Dog d=新狗();
Cat c=新Cat();
列表l=新列表(){d,c};
在我的数据类型中不需要协方差


因此,协变接口优于
列表
数据结构,优于类似的
Foo(…)
方法,其好处在于“当需要将某些内部部分连接在一起时”,比如在键值对的情况下?

我认为这是一个非常有趣的问题。你基本上是在问一个例子,其中(1)有一个简单的解决方案使用协变接口,但(2)没有简单的解决方案,如果你唯一的选择是使方法通用

这里有一个例子:假设我想要一个键值对数组,其中键是一个字符串,值是动物的某个子类型。使用协变类型,我可以执行以下操作:

var kv1 = new CovariantKeyValuePair<string, Dog>("MyDog", myDog);
var kv2 = new CovariantKeyValuePair<string, Cat>("MyCat", myCat);

ICovariantKeyValuePair<string, Animal>[] myAnimals = { kv1, kv2 };
var kv1=新的协方差KeyValuePair(“MyDog”,MyDog);
var kv2=新的协方差KeyValuePair(“MyCat”,MyCat);
ICovariantKeyValuePair[]myAnimals={kv1,kv2};

这只可能是因为类型是协变的,即。,因为
kv1
是一个
ICovariantKeyValuePair

你应该看看这里的帖子:你可能会被否决,因为这个问题可能被解释为主要基于观点,而不是能够以客观正确的答案来回答。“协变接口能提供哪些通用参数不能提供的功能?”然而,这是可以客观回答的。我根据您的输入将我的问题扩展到,希望能更接近中心点。我理解,只要我不想将键和值拆分为两个独立的参数,您编写的字典就不可能实现。
var kv1 = new CovariantKeyValuePair<string, Dog>("MyDog", myDog);
var kv2 = new CovariantKeyValuePair<string, Cat>("MyCat", myCat);

ICovariantKeyValuePair<string, Animal>[] myAnimals = { kv1, kv2 };