小编Ash*_*ohn的帖子

通用协方差和逆变

考虑代码片段.

IList<String> obj=new List<string>();
IEnumerable<Object> obj1 = obj;
Run Code Online (Sandbox Code Playgroud)

但如果我写ICollection<Object> obj2 = obj;它会抛出编译时错误.

无法隐式将类型' System.Collections.Generic.IList<string>' 转换为' System.Collections.Generic.ICollection<object>'.

为什么,因为这种行为List<T>同时实现了IEnumerable<T>ICollection<T>,也IList<T>被定义为

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
{
    T this[int index] { get; set; }
    int IndexOf(T item);
    void Insert(int index, T item);
    void RemoveAt(int index);
}
Run Code Online (Sandbox Code Playgroud)

c# generics covariance contravariance

16
推荐指数
1
解决办法
1266
查看次数

虚拟方法的重载分辨率

考虑一下代码

public class Base
{
   public virtual int Add(int a,int b)
   {
      return a+b;
   }
}

public class Derived:Base
{
   public override int Add(int a,int b)
   {
      return a+b;
   }

   public int Add(float a,float b)
   {
      return (Int32)(a + b);
   }
}
Run Code Online (Sandbox Code Playgroud)

如果我创建Derived类的实例并使用int类型的参数调用Add,为什么它使用float参数调用Add方法

Derived obj =new Derived()
obj.Add(3,5)

// why this is calling 
Add(float a,float b)
Run Code Online (Sandbox Code Playgroud)

为什么不调用更具体的方法?

c# methods virtual overloading

11
推荐指数
1
解决办法
1464
查看次数

列表与数组中的索引器

如何在列表和数组中定义索引器.

List<MyStruct> lists=new List<MyStruct>();MyStruct结构在哪里.现在考虑一下 MyStruct[] arr=new MyStruct[10];

arr[0]给出了第一个Structure项的引用.但是lists[0]给了我一份它的副本.是否有任何理由这样做.此外,由于Int32结构是List<Int32> list1 =new List<Int32>();如何可以访问list1[0]或分配list1[0]=5在不可能的地方lists[0]._x=5

c# value-type

10
推荐指数
2
解决办法
9806
查看次数

字符串由index/params分割?

就在我编写自己的函数之前,只想检查是否存在类似 string.split(string input, params int[] indexes) .NET库的函数?此函数应该将字符串拆分为传递给它的索引.

编辑:我不应该添加string.join句子 - 这是令人困惑的.

c# string split

8
推荐指数
3
解决办法
4万
查看次数

委托协方差和无条件

请考虑以下代码段

namespace ConsoleApplication1
{

public delegate TResult Function<in T, out TResult>(T args);

 class Program
 {
      static void Main(string[] args)
    {
        Program pg =new Program();
        Function<Object, DerivedClass> fn1 = null;
        Function<String, BaseClass> fn2 = null;
        fn1 = new Function<object, DerivedClass>(pg.myCheckFuntion)
        fn2=fn1;
        fn2("");// calls myCheckFuntion(Object a)
        pg.myCheckFuntion("Hello"); //calls myCheckFuntion(String a)
     }

     public DerivedClass myCheckFuntion(Object a)
    {
        return  new DerivedClass();
    }
    public DerivedClass myCheckFuntion(String a)
    { 
        return new DerivedClass();
    }
 }
Run Code Online (Sandbox Code Playgroud)

为什么委托调用和普通方法调用调用不同的方法.

c# delegates covariance

7
推荐指数
1
解决办法
154
查看次数

LINQ与Method表达式的差异

为什么Linq表达式IL会导致省略Select投影,而相应的方法表达式会保留Select投影?

我想这两段代码也是一样的.

 var a = from c in companies
                where c.Length >10
                select c;

//

var b = companies.Where(c => c.Length > 10).Select(c => c);

//IL - LINQ

IEnumerable<string> a = this.companies.
Where<string>(CS$<>9__CachedAnonymousMethodDelegate1);

//IL

   IEnumerable<string> b = this.companies.Where<string>
   (CS$<>9__CachedAnonymousMethodDelegate4).Select<string, string>
   (CS$<>9__CachedAnonymousMethodDelegate5);
Run Code Online (Sandbox Code Playgroud)

那为什么IL的区别呢?

编辑:那么为什么

  var a = from c in companies
           select c;
Run Code Online (Sandbox Code Playgroud)

即使在IL内部也会导致SELECT投影.它也可以省略吗?

c# linq

6
推荐指数
3
解决办法
276
查看次数

foreach和list.ForEach()之间的闭包有何不同?

考虑这段代码.

        var values = new List<int> {123, 432, 768};

        var funcs = new List<Func<int>>();

        values.ForEach(v=>funcs.Add(()=>v));

        funcs.ForEach(f=>Console.WriteLine(f()));//prints 123,432,768

        funcs.Clear();

        foreach (var v1 in values)
        {
            funcs.Add(()=>v1);
        }

        foreach (var func in funcs)
        {
            Console.WriteLine(func());  //prints 768,768,768
        } 
Run Code Online (Sandbox Code Playgroud)

我知道由于lambda捕获的闭包变量,第二个foreach打印768次3次.为什么在第一种情况下不会发生?foreach关键字如何与方法不同Foreach?当我这样做时,表达式是否被评估?values.ForEach

c# foreach closures c#-4.0

5
推荐指数
2
解决办法
635
查看次数

使用CTE而不是Cursor

我有以下表格结构.

我只想将SubId更新为其为null的所有行,其中RawLineNumber以1 递增,SeqNumber以1递增.

RawlineNumber Claimid SubId SeqNumber
1             6000    A100  1
2             6000    NULL  2
3             6000    NULL  3
10            6000    A200  1
11            6000    NULL  2
25            6000    A300  1
26            6000    NULL  2
27            6000    NULL  3
Run Code Online (Sandbox Code Playgroud)

我想更新
SUBIDRawLineNumber与A100 2和3,
SUBIDRawLineNumber 11与A200,
SUBIDRawLineNumber 26和27架A300.

我有一个光标可以完成这项工作但是我可以用CTE来处理它吗?

t-sql sql-server-2005 cursor common-table-expression cross-apply

4
推荐指数
1
解决办法
1412
查看次数

检查两个修改列表

我有两个不同类型的列表,它们具有以下常见属性.

Id - >用于识别相应的对象

Bunch of other Properties

ModificationDate

需要根据修改日期比较这两个列表.如果修改日期不同(第一个列表ModificationDate大于第二个列表的ModificationDate那个,则将所有属性复制,如果该项目从第一个列表到第二个列表.

请让我知道最好的方法.

编辑:第二个列表可能包含或不包含第一个列表的所有元素,反之亦然.我的第一个列表始终是源列表.因此,如果一个项目存在于列表1中而不存在于列表2中,我们需要将其添加到列表2中.如果列表2中存在但是不在列表1中的项目则将其从列表2中删除.

c# ienumerable c#-4.0

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

更改.net Framework dll需要重新签名吗?

如果我们反编译GAC中存在的.net框架dll(例如.System.Linq.Expressions.dll),在IL中进行了一些更改并将其组装回去,我们是否需要重新签名?

.net c# gac

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

处理FOR XML中的NULL值

            SELECT Col1
    FROM Table
    WHERE Col2 = 63895746
    ORDER BY Col
    FOR XML PATH,TYPE
Run Code Online (Sandbox Code Playgroud)

我在结果中不需要NULLS.我希望结果被<Cols> </ Cols>包裹,即使col1为null也不是

在这个例子中,Table不包含col2 = 63895746的任何行,所以我将获得一个空结果集,因此type指令将使其为NULL并返回它

sql sql-server sql-server-2008

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