介绍
我知道"不允许在基类之间进行用户定义的转换".作为对此规则的解释,MSDN给出了"您不需要此运算符".
我确实理解不需要用户定义到基类的转换,因为这显然是隐式完成的.但是,我确实需要从基类转换.
在我目前的设计中,非托管代码的包装器,我使用指针存储在Entity类中.所有使用指针的类都派生自该Entity类,例如Body类.
因此我有:
方法A.
class Entity
{
IntPtr Pointer;
Entity(IntPtr pointer)
{
this.Pointer = pointer;
}
}
class Body : Entity
{
Body(IntPtr pointer) : base(pointer) { }
explicit operator Body(Entity e)
{
return new Body(e.Pointer);
}
}
Run Code Online (Sandbox Code Playgroud)
这个演员是非法的.(注意,我没有打扰写入访问器).没有它,编译器将允许我这样做:
方法B.
(Body)myEntity
...
Run Code Online (Sandbox Code Playgroud)
但是,在运行时,我会得到一个例外,说这个演员是不可能的.
结论
因此,我需要从基类进行用户定义的转换,而C#拒绝它给我.使用方法A,编译器会抱怨,但代码在运行时逻辑上可以工作.使用方法B,编译器不会抱怨,但代码在运行时显然会失败.
在这种情况下我觉得奇怪的是,MSDN告诉我我不需要这个运算符,并且编译器就像隐含的一样(方法B).我应该做些什么?
我知道我可以使用:
解决方案A.
class Body : Entity
{
Body(IntPtr pointer) : base(pointer) { }
static Body FromEntity(Entity e)
{
return new Body(e.Pointer);
} …
Run Code Online (Sandbox Code Playgroud) 我(终于!)找到了一种在玻璃上渲染Windows.Forms控件的方法,它似乎没有任何重大缺点,也没有任何大的实现时间.它受到Coded 的这篇文章的启发,它基本上解释了如何本地覆盖控件绘制以绘制它们.
我使用该方法将控件渲染为位图,并使用GDI +和适当的Alpha通道将其绘制回NativeWindow的绘制区域.实现很简单,但可以完善可用性,但这不是这个问题的重点.然而,结果非常令人满意:
但是,有两个区域需要修复才能真正使用.
SetStyles(this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true)
不起作用,但我怀疑我们可以通过一些试验和错误使其工作.某些控件不起作用.我已经能够完成以下工作:
但我不能让这些工作,虽然我不明白为什么不.我有根据的猜测是,实际的NativeWindow句柄我引用了整个控件,而我需要引用它的"输入"(文本)部分,可能是一个孩子.有关如何获取输入窗口句柄的WinAPI专家的任何帮助都是受欢迎的.
但修复双缓冲将是可用性的主要关注点.
这是一个示例用法:
new GlassControlRenderer(textBox1);
Run Code Online (Sandbox Code Playgroud)
这是代码:
public class GlassControlRenderer : NativeWindow
{
private Control Control;
private Bitmap Bitmap;
private Graphics ControlGraphics;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0xF: // WM_PAINT
case 0x85: // WM_NCPAINT
case 0x100: // WM_KEYDOWN
case 0x200: // WM_MOUSEMOVE
case 0x201: …
Run Code Online (Sandbox Code Playgroud) 它们是堆栈上的不可变值类型.什么阻止我让他们成为一个常量?
参考文献:
我已经习惯了VS2008,在按下F6或在菜单Build> Build Solution中构建发布版本.
构建菜单已经消失,虽然我可以构建解决方案(通过F6),但它只构建调试.
我假设现在有某种配置管理器,但我无法在任何地方找到它.
我见过很多表达式来删除特定的标签(或多个指定标签),以及一个以删除所有,但一个特定的标签,但我还没有找到一种方法,除了许多排除(即所有除了全部删除p, b, i, u, a, ul, ol, li
)在PHP.我对正则表达式很不满意,所以我需要一只手.:) 谢谢!
我在尝试创建一个严重依赖于泛型的类的新实例时遇到以下异常:
new TestServer(8888);
System.TypeLoadException
GenericArguments[0], 'TOutPacket', on
'Library.Net.Relay`4[TInPacket,TOutPacket,TCryptograph,TEndian]'
violates the constraint of type parameter 'TInPacket'.
at System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle handle, IntPtr* pInst, Int32 numGenericArgs, ObjectHandleOnStack type)
at System.RuntimeTypeHandle.Instantiate(Type[] inst)
at System.RuntimeType.MakeGenericType(Type[] instantiation)
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么会这样.编译时是否检查了通用约束?
我的谷歌搜索让我得出结论,这与这些原因中的任何一个有关,或者(有时?)两者:
where
在类中定义泛型约束()的顺序;我不准备牺牲的一件事是自我参照模式.我绝对需要它用于特定目的.
但是,我想帮助指出这个问题出现的地点和原因.由于库是庞大的并且产生了巨大的通用模式,我认为最好根据请求逐步提供代码位.
根据要求,再次声明.但我想强调的是,我宁愿一般都知道为什么会发生这样的异常,然后在我的特定代码中自行修复它,而不是为后代找到特定的修复.此外,这将是更长的人分析代码来回答,而不是给一般的解释,为什么泛型类型的限制可以在运行时被侵犯.
执行声明:
class TestServer : Server<TestServer, TestClient, ServerPacket.In, ServerPacket.Out, BlankCryptograph, LittleEndianBitConverter>
class TestClient : AwareClient<TestOperationCode, TestServer, TestClient, ServerPacket.In, ServerPacket.Out, BlankCryptograph, LittleEndianBitConverter>
class ServerPacket
{
public abstract class In : AwarePacket<TestOperationCode, TestServer, TestClient, ServerPacket.In, ServerPacket.Out, BlankCryptograph, LittleEndianBitConverter>.In
public class Out : …
Run Code Online (Sandbox Code Playgroud) 我有一个类似于此的字节数组(16字节):
71 77 65 72 74 79 00 00 00 00 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)
我用它来将它转换为字符串并修剪结束空格:
ASCIIEncoding.ASCII.GetString(data).Trim();
Run Code Online (Sandbox Code Playgroud)
我得到的字符串很好,但它仍然有所有结束空格.所以我得到类似的东西"qwerty.........."
(由于StackOverflow,点是空格).
我究竟做错了什么?
我也尝试使用.TrimEnd()并使用UTF8编码,但它不会改变任何东西.
提前致谢 :)
这个标题几乎是不言自明的,我正在为这种简单而自杀.
看着这里,但没什么用处.
为了与我的编码风格保持一致,我想camelCase
用来访问属性而不是snake_case
.在没有修改核心框架的情况下,Laravel可以实现这一点吗?如果是这样,怎么样?
例:
// Database column: first_name
echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior
Run Code Online (Sandbox Code Playgroud) 或者为什么以下不可能:
class Material
{
class Keys
{
...
}
Material.Keys Keys { get; set; } // Illegal
}
Run Code Online (Sandbox Code Playgroud)
我没有看到任何可能的歧义.按实例访问时,返回属性.静态访问时,返回类.或者我错过了什么?
我不是要求"修复"(我知道我可以用不同的名称来命名,比如MaterialKeys等),但更多的是这个限制背后的技术原因.