如果我像类一样编写泛型类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)
可以通过重载运算符来实现吗?我知道如果我的班级不是通用的话可以做到......
有没有人知道是否可以将具有某个类型参数(例如Bar)的泛型类型转换为相同的泛型类型,其中type参数是Bar的基本类型(例如我的对象中的对象).并且,如果有可能,它将如何完成?
我想要做的是有一个集合Foo<object>但能够添加具有更多特定类型参数的Foos.
谢谢
我正在阅读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 预期.
请您更清楚地解释为什么值类型必须是不可变的.我知道它对线程安全有好处,但在这种情况下,同样可以应用于引用类型.
我编写了以下递归函数,但由于最大递归深度而导致运行时错误.我想知道是否有可能编写一个迭代函数来克服这个问题:
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) 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'类型(或从中派生)
有人可以解释这种行为吗?这里有些根本错误!
我有一个带有重载方法的类:
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>)'
什么是最好的解决方法?
据我所知,父类的构造函数先调用然后调用子类.但是为什么在静态构造函数的情况下它首先从派生类执行,然后是子类?
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) 在我将在本地网络上托管的服务之间使用ssl sertificate之前,我想更多地了解它.通过在互联网上阅读,我了解SSL的工作原理.
知道这里有一些我不明白的事情:
假设我有以下通用组合生成器静态方法:
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 ,而不是返回整个组合组?
我不确定如何使这个问题可读/可理解,但听到我的意见,我希望你能在我们结束时理解我的问题(至少,它很容易重现).
我尝试调用一个用于在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)
这意味着,它需要以下输入
因此,此方法的实际执行可能如下所示:
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)
任何人都可以指出为什么编译器无法推断出这种情况?