小编Eri*_*ert的帖子

隐式地将泛型<T>转换回T

如果我像类一样编写泛型类MyGeneric<T>,可以将一个隐式转换写入类型T,所以我可以这样做:

public class MyGeneric<T>
{
...
}

public class GenericProperties
{
   public MyGeneric<string> MyGenericString {get;set;}

   public void UseMyGeneric()
   {
       string sTest = MyGenericString;
       MyGenericString = "this is a test";
   }
}
Run Code Online (Sandbox Code Playgroud)

可以通过重载运算符来实现吗?我知道如果我的班级不是通用的话可以做到......

.net c# generics .net-3.5

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

C#将Foo <Bar>转换为Foo <object>

有没有人知道是否可以将具有某个类型参数(例如Bar)的泛型类型转换为相同的泛型类型,其中type参数是Bar的基本类型(例如我的对象中的对象).并且,如果有可能,它将如何完成?

我想要做的是有一个集合Foo<object>但能够添加具有更多特定类型参数的Foos.

谢谢

c# generics casting covariance

8
推荐指数
1
解决办法
937
查看次数

不可变值类型

我正在阅读Eric Liperts关于Mutating Readonly Structs的博客,我在这里看到很多参考资料,作为一个论证为什么值类型必须是不可变的.但仍然有一点不清楚,说当你访问值类型时,你总是得到它的副本,这是一个例子:

struct Mutable
{
    private int x;
    public int Mutate()
    {
        this.x = this.x + 1;
        return this.x;
    }
}

class Test
{
    public readonly Mutable m = new Mutable();
    static void Main(string[] args)
    {
        Test t = new Test();
        System.Console.WriteLine(t.m.Mutate());
        System.Console.WriteLine(t.m.Mutate());
        System.Console.WriteLine(t.m.Mutate());
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是这就是我改变时的原因

public readonly Mutable m = new Mutable();
Run Code Online (Sandbox Code Playgroud)

public Mutable m = new Mutable();
Run Code Online (Sandbox Code Playgroud)

一切都开始工作es 预期.

请您更清楚地解释为什么值类型必须是不可变的.我知道它对线程安全有好处,但在这种情况下,同样可以应用于引用类型.

.net c# clr

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

将递归函数转换为迭代函数

我编写了以下递归函数,但由于最大递归深度而导致运行时错误.我想知道是否有可能编写一个迭代函数来克服这个问题:

def finaldistance(n):

   if n%2 == 0:
       return 1 + finaldistance(n//2) 

   elif n != 1:
       a = finaldistance(n-1)+1
       b = distance(n)
       return min(a,b)

   else:
       return 0
Run Code Online (Sandbox Code Playgroud)

我试过的是这个,但似乎没有用,

def finaldistance(n, acc):

   while n > 1:

     if n%2 == 0:
        (n, acc) = (n//2, acc+1)

     else:
        a = finaldistance(n-1, acc) + 1
        b = distance(n)
        if a < b:
          (n, acc) = (n-1, acc+1)

        else:
          (n, acc) =(1, acc + distance(n))

   return acc
Run Code Online (Sandbox Code Playgroud)

python algorithm python-3.x

7
推荐指数
2
解决办法
461
查看次数

返回基础知识 - C#编译器错误

public class BaseClass 
{
  protected void BaseMethod() 
  { 

  }
}

public class DerivedClass : BaseClass 
{
  public void Test() 
  {
    DerivedClass d1 = new DerivedClass();
    d1.BaseMethod(); // No error here.        

    BaseClass b1 = new DerivedClass();
    b1.BaseMethod(); // I get compile-time error for this. Why ? 
  }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码(在VS2005上编译),我得到以下编译时错误 -

错误1无法通过类型为"BaseClass"的限定符访问受保护的成员'BaseClass.BaseMethod()'; 限定符必须是'DerivedClass'类型(或从中派生)

有人可以解释这种行为吗?这里有些根本错误!

c# compiler-errors

6
推荐指数
1
解决办法
213
查看次数

在C#.NET中使用Lambda进行模糊调用

我有一个带有重载方法的类:

MyClass.DoThis(Action<Foo> action);
MyClass.DoThis(Action<Bar> action);
Run Code Online (Sandbox Code Playgroud)

我想将lambda表达式传递给Action版本:

MyClass.DoThis( foo => foo.DoSomething() );
Run Code Online (Sandbox Code Playgroud)

不幸的是,由于围绕"foo"变量的类型推断,Visual Studio无法区分Action<Foo>Action<Bar>版本之间的区别- 因此它引发了编译器错误:

以下方法或属性之间的调用不明确:'MyClass.DoThis(System.Action <Foo>)'和'MyClass.DoThis(System.Action <Bar>)'

什么是最好的解决方法?

.net c# lambda

6
推荐指数
1
解决办法
911
查看次数

调用静态构造函数和实例构造函数

据我所知,父类的构造函数先调用然后调用子类.但是为什么在静态构造函数的情况下它首先从派生类执行,然后是子类?

namespace ConsoleApplication1

    {

 class Program

    {

        static void Main(string[] args)
        {
            Child t = new Child();
        }
    }

    class Parent
    {
        public  Parent()
        {
            Console.WriteLine("Parent Instance Constructor");
            Console.ReadKey();
        }

        static Parent()
        {
            Console.WriteLine("Parent Static Constructor");
            Console.ReadKey();
        }
    }
    class Child : Parent
    {
        public Child()
        {
            Console.WriteLine("Child Instance Constructor");
            Console.ReadKey();
        }

        static Child()
        {
            Console.WriteLine("Child Static Constructor");
            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

子静态构造函数

父静态构造函数

父实例构造函数

子实例构造函数

现在按照Jeppe Stig Nielsen建议,当我在构造函数中初始化静态字段时,它按以下顺序运行

产量

父静态构造函数

子静态构造函数

父实例构造函数

子实例构造函数

class XyzParent
{ …
Run Code Online (Sandbox Code Playgroud)

c#

6
推荐指数
2
解决办法
7596
查看次数

使用SSL存储时私钥在哪里?

在我将在本地网络上托管的服务之间使用ssl sertificate之前,我想更多地了解它.通过在互联网上阅读,我了解SSL的工作原理.

  1. 客户端连接到WCF服务
  2. WCF服务回复它的公钥和它的证书
  3. 然后,客户端验证证书并使用公钥加密其凭证
  4. wcf服务然后使用它的私钥解密该消息并验证信息
  5. 等等...

知道这里有一些我不明白的事情:

  • 在第4步.WCF服务在哪里找到它的私钥?
  • 为什么需要SSL证书?从在互联网上阅读,需要验证服务是我想要的.这对我没有意义,因为首先我知道我的本地网络上的服务的IP地址(我知道该服务是谁).假装这不是我在互联网上的情况,有人试图破解我.在那种情况下,我相信,如果我连接到他们的服务而不是我的真实服务,那么我无能为力,因为如果你回想起第2步,WCF服务回复了公钥和证书(在纯文本上),这意味着有人可以获得该证书并使用它吗?
  • 如果我使用SSL sertifiate并且有人可以访问托管该服务的计算机,他可能会以某种方式获取私钥使我的连接不安全?

security ssl wcf

6
推荐指数
2
解决办法
4278
查看次数

C#如何让SelectMany返回收益?

假设我有以下通用组合生成器静态方法:

public static IEnumerable<IEnumerable<T>> GetAllPossibleCombos<T>(
    IEnumerable<IEnumerable<T>> items)
{
    IEnumerable<IEnumerable<T>> combos = new[] {new T[0]};

    foreach (var inner in items)
        combos = combos.SelectMany(c => inner, (c, i) => c.Append(i));

     return combos;
}
Run Code Online (Sandbox Code Playgroud)

也许我没有正确理解这一点,但是这不是在RAM中建立整个组合列表吗?如果存在大量项目,则该方法可能导致计算机的RAM用尽。

有没有一种方法可以重写方法以yield return在每个组合上使用a ,而不是返回整个组合组?

c# linq combinatorics

6
推荐指数
1
解决办法
281
查看次数

为什么方法类型推断无法推断出类型参数?

我不确定如何使这个问题可读/可理解,但听到我的意见,我希望你能在我们结束时理解我的问题(至少,它很容易重现).

我尝试调用一个用于在UnitTests中验证结果的方法.它有以下签名:

void AssertPropertyValues<TEnumerable, TElement, TProperty>(
  TEnumerable enumerable, 
  Func<TElement, TProperty> propertyPointer, 
  params TProperty[] expectedValues) 
  where TEnumerable : System.Collections.Generic.IList<TElement>
Run Code Online (Sandbox Code Playgroud)

这意味着,它需要以下输入

  1. 任何可枚举的对象,包含与2的intput相同类型的对象.
  2. 一个Func(通常封装lambda表达式),它接受与1)的"contents"相同类型的对象,并返回与3)中提供的数组内容类型相同的Type类型的对象.
  3. 与2)中Func的输出相同类型的对象数组.

因此,此方法的实际执行可能如下所示:

AssertPropertyValues(
  item.ItemGroups, 
  itemGroup => itemGroup.Name, 
  "Name1", "Name2", "Name3");
Run Code Online (Sandbox Code Playgroud)

至少,这就是我希望它看起来像,但我遇到了众所周知的编译器错误:"方法'X'的类型参数不能从使用中推断出来.",这就是我不知道的了解.它应该具有我所能看到的所有信息,或者它可能是"协方差和反演"问题的另一个版本?

所以现在我不得不这样做:

AssertPropertyValues(
  item.ItemGroups, 
  (ItemGroup itemGroup) => itemGroup.Name, 
  "Name1", "Name2", "Name3");
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出为什么编译器无法推断出这种情况?

c# generics lambda

5
推荐指数
1
解决办法
231
查看次数