这种限制的真正原因是什么?这只是必须完成的工作吗?概念上难吗?这不可能吗?
当然,人们不能在字段中使用类型参数,因为它们总是读写.但这不是答案,可以吗?
这个问题的原因是我在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#应该允许这个.只是想了解是什么原因导致它没有.
拿这个小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的限制而被认为实施起来太昂贵了?如果是后者,我作为开发人员应该知道什么是上述限制?
考虑到接口支持它,我希望从逻辑上遵循该类支持.
新的.NET 4.0泛型类型参数的协同和逆变仅适用于接口和委托.不支持课程的原因是什么?
我正在围绕 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>>则不会出现错误。
有谁知道为什么它不能转换它?谢谢!
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# ×5
covariance ×3
c#-4.0 ×2
generics ×2
async-await ×1
asynchronous ×1
c#-2.0 ×1
class ×1
clr ×1
list ×1
types ×1