相关疑难解决方法(0)

为什么C#(4.0)不允许泛型类的共同和逆变?

这种限制的真正原因是什么?这只是必须完成的工作吗?概念上难吗?这不可能吗?

当然,人们不能在字段中使用类型参数,因为它们总是读写.但这不是答案,可以吗?

这个问题的原因是我在C#4上写了一篇关于方差支持的文章,我觉得我应该解释为什么它仅限于委托和接口.只是为了逆转举证责任.

更新: 埃里克问了一个例子.

怎么样(不知道这是否有意义,但是:-))

public class Lookup<out T> where T : Animal {
  public T Find(string name) {
    Animal a = _cache.FindAnimalByName(name);
    return a as T;
  }
}

var findReptiles = new Lookup<Reptile>();
Lookup<Animal> findAnimals = findReptiles;
Run Code Online (Sandbox Code Playgroud)

在一个类中拥有它的原因可能是类本身中保存的缓存.请不要将您的不同类型的宠物命名为相同!

顺便说一句,这让我想到了C#5.0中的可选类型参数 :-)

更新2:我没有声称CLR和C#应该允许这个.只是想了解是什么原因导致它没有.

c# generics covariance contravariance c#-4.0

22
推荐指数
2
解决办法
4379
查看次数

为什么C#不支持变体泛型类?

拿这个小LINQPad示例:

void Main()
{
    Foo<object> foo = new Foo<string>();
    Console.WriteLine(foo.Get());
}

class Foo<out T>
{
    public T Get()
    {
        return default(T);
    }
}
Run Code Online (Sandbox Code Playgroud)

它无法使用此错误进行编译:

方差修饰符无效.只能将接口和委托类型参数指定为变量.

我没有看到代码的任何逻辑问题.一切都可以静态验证.为什么不允许这样做?它是否会导致语言不一致,或者由于CLR的限制而被认为实施起来太昂贵了?如果是后者,我作为开发人员应该知道什么是上述限制?

考虑到接口支持它,我希望从逻辑上遵循该类支持.

c# generics class generic-variance

19
推荐指数
1
解决办法
1680
查看次数

如何在CLR上运行需要协变返回类型和"真实"类方差的语言Scala?

CLR不支持协变返回类型完全方差(即应用于类,而不仅仅是接口和委托),但有些语言针对CLR使用这些功能中的一个或两个.

CLR是否有一些实用的解决方法来启用此功能,或者这些语言是否采用某种重写/擦除/ ...技术来完全支持其功能集?

c# clr types c#-2.0

9
推荐指数
1
解决办法
380
查看次数

3
推荐指数
1
解决办法
1221
查看次数

无法将任务&lt;List&lt;TEntity&gt;&gt; 转换为任务&lt;IList&lt;TEntity&gt;&gt;

我正在围绕 EF Core 编写一个小包装方法DbSet。我有以下方法:

public Task<IList<TEntity>> GetAsync(Func<IQueryable<TEntity>, IQueryable<TEntity>> getFunction)
{
    if (getFunction == null)
    {
        Task.FromResult(new List<TEntity>());
    }
    return getFunction(_dbSet).AsNoTracking().ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该类是通用的,并且 _dbSet 是DbSet上下文中具体的实例。然而,对于这个问题来说,这并不重要。
对于代码我得到以下错误:

[CS0029] 无法将类型“System.Threading.Tasks.Task>”隐式转换为“System.Threading.Tasks.Task>”

如果我将返回值更改为Task<List<TEntity>>则不会出现错误。
有谁知道为什么它不能转换它?谢谢!

c# asynchronous covariance contravariance async-await

3
推荐指数
1
解决办法
2012
查看次数

从列表访问字典时的异常

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            List<object> list = new List<object>();
            List<Dictionary<string, object>> dict = new List<Dictionary<string, object>>();

            Dictionary<string, object> master = new Dictionary<string, object>();
            master.Add("list", list);
            master.Add("dict", dict);

            List<object> mydict = (List<object>)master["dict"]; // this is where i get exception
            Console.Write("Count: ", mydict.Count);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它在粗线上抛出异常.为什么这种行为以及如何访问此元素?谢谢Sumanth

c# list

2
推荐指数
1
解决办法
109
查看次数