C# 使用带有IEnumerable值的字典时,无法从用法推断方法的类型参数 使用系统; 使用System.Collections.Generic; 公开课考试 { 静态列表F(IDictionary dictionary) { // ... 返回新列表(); // ... } 公共静态void Main() { var mydict=新字典(); F(mydict); } }

C# 使用带有IEnumerable值的字典时,无法从用法推断方法的类型参数 使用系统; 使用System.Collections.Generic; 公开课考试 { 静态列表F(IDictionary dictionary) { // ... 返回新列表(); // ... } 公共静态void Main() { var mydict=新字典(); F(mydict); } },c#,generics,C#,Generics,在以下操作之后显示错误消息: prog.cs(16,3):错误CS0411:无法从用法中推断“Test.F(System.Collections.Generic.IDictionary)”方法的类型参数。尝试显式指定类型参数 编译失败:1个错误,0个警告 IDictionary在值类型中是不变的,因此IDictionary不是IDictionary,即使LinkedList是IEnumerableIDictionary在值类型中是不变的,因此,IDictionary不是IDictionary,即

在以下操作之后显示错误消息:

prog.cs(16,3):错误CS0411:无法从用法中推断“Test.F(System.Collections.Generic.IDictionary)”方法的类型参数。尝试显式指定类型参数
编译失败:1个错误,0个警告

IDictionary
在值类型中是不变的,因此
IDictionary
不是
IDictionary
,即使
LinkedList
IEnumerable
IDictionary
在值类型中是不变的,因此,
IDictionary
不是
IDictionary
,即使
LinkedList
IEnumerable
Dictionary
不是
字典
Dictionary
不是
字典该代码是不正确的,因为您将其声明为
IEnumerable
,但您是给它一个
LinkedList
,如果编译的代码是
列表,那么您就可以将
列表
填入传递给该方法的字典中。如果您将
mydict
声明更改为同时使用
IEnumerable
,则代码将编译。此代码不正确,因为您将其声明为使用
IEnumerable
,但您给了它一个
LinkedList
,如果编译了代码,则可以将
列表
填充到传递给该方法的字典中。如果将
mydict
声明更改为同时使用
IEnumerable
,则代码将编译。
using System;
using System.Collections.Generic;

public class Test
{

    static List<T> F<T>(IDictionary<int, IEnumerable<T>> dictionary)
    {
        // ...
        return new List<T>();
        // ...
    }

    public static void Main()
    {
        var mydict = new Dictionary<int, LinkedList<int>>();
        F(mydict);
    }
}
prog.cs(16,3): error CS0411: The type arguments for method `Test.F<T>(System.Collections.Generic.IDictionary<int,System.Collections.Generic.IEnumerable<T>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly
Compilation failed: 1 error(s), 0 warnings
static List<T> F<T, U>(IDictionary<int, U> dictionary) where U : IEnumerable<T>
F<int, LinkedList<int>>(mydict);