为什么受“Enum”限制的generics类型无法在C#7.3中被认定为“结构”?

如果我有一个带有struct约束的generics接口,如下所示: public interface IStruct where T : struct { } 我可以提供枚举作为我的类型T ,因为enum满足struct约束: public class EnumIsAStruct : IStruct { } C#7.3添加了一个Enum约束 。 以下代码以前是非法的,现在编译: public class MCVE : IStruct where T : struct, Enum { } 但令我惊讶的是,以下内容无法编译: public class MCVE : IStruct where T : Enum { } ……有错误 CS0453类型’T’必须是非可空值类型才能在generics类型或方法’IStruct’中将其用作参数’T’ 为什么是这样? 我希望由Enum约束的generics类型可用作类型参数,其中类型受struct约束但似乎不是这种情况 – 我必须将我的Enum约束更改为struct, Enum 。 我的期望是错的吗?

计算端点给定距离,方位,起点

我试图找到目的地点,给定起点纬度/长度,方位和距离。 下面这个网站的计算器给了我想要的结果。 http://www.movable-type.co.uk/scripts/latlong.html 当我尝试通过代码实现相同的操作时,我得不到正确的结果。 以下是我的代码 – private GLatLng pointRadialDistance(double lat1, double lon1, double radianBearing, double radialDistance) { double rEarth = 6371.01; lat1 = DegreeToRadian(lat1); lon1 = DegreeToRadian(lon1); radianBearing = DegreeToRadian(radianBearing); radialDistance = radialDistance / rEarth; double lat = Math.Asin(Math.Sin(lat1) * Math.Cos(radialDistance) + Math.Cos(lat1) * Math.Sin(radialDistance) * Math.Cos(radianBearing)); double lon; if (Math.Cos(lat) == 0) { // […]

如何以CLR“友好”的方式获取_real_线程ID?

作为练习,我正在编写一些代码来显示进程内的O / S进程和O / S线程(如Sysinternals进程资源管理器那样)。 我发现.net的ManagedThreadId(s)不是O / S线程ID。 经过一些阅读后,我遇到了AppDomain.GetCurrentThreadId()。 不幸的是,该function被标记为“过时”(这可能意味着将来“不可用”)。 我找到的一个解决方案是使用InteropServices直接调用Win32 GetCurrentThreadId。 我很好,但是,它与.net哲学背道而驰。 我的问题是:是否有一种CLR“友好”的方式来获取当前线程的真实ID? 作为参考,这里有一段代码,显示了我到目前为止所尝试的内容。 // 1和// 2显示正确的线程ID,// 3和// 4尝试以CLR友好的方式获取相同的信息(但它们不起作用。) 谢谢您的帮助, 约翰。 [DllImport(“kernel32.dll”)] static extern int GetCurrentThreadId(); static void Main(string[] args) { // AppDomain.GetCurrentThreadId() is “obsolete” int ThreadId1 = AppDomain.GetCurrentThreadId(); // 1 // not the “.net” way of doing things int ThreadId2 = GetCurrentThreadId(); // […]

有一个“’Resource.Attribute’不包含’actionBarSize’的定义”错误

试图调试一个空的应用程序并得到“’Resource.Attribute’不包含’actionBarSize’的定义”错误。 我重新安装了android SDK。 public static void UpdateIdValues() { global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarSize = global::L1NQ.Droid.Resource.Attribute.actionBarSize; } public partial class Attribute { static Attribute() { global::Android.Runtime.ResourceIdManager.UpdateIdValues(); } private Attribute() { } }

使用LockBits从内存创建的GDI +generics错误保存位图

根据我在SO和网络上的研究,保存位图时的GDI +generics错误显然是一个常见问题。 鉴于以下简化代码段: byte[] bytes = new byte[2048 * 2048 * 2]; for (int i = 0; i < bytes.Length; i++) { // set random or constant pixel data, whatever you want } Bitmap bmp = new Bitmap(2048, 2048, PixelFormat.Format16bppGrayScale); BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, 2048, 2048), ImageLockMode.ReadWrite, bmp.PixelFormat); System.Runtime.InteropServices.Marshal.Copy(bytes, 0, bmpData.Scan0, 8388608); bmp.UnlockBits(bmpData); […]

永久禁用EF中的Configuration.ProxyCreationEnabled?

而不是必须在每个查询上执行以下操作,有没有办法只是全局设置该值? 模型视图中有一个延迟加载设置,但似乎没有ProxyCreation的设置。 using (var context = new LabEntities()) { **context.Configuration.ProxyCreationEnabled = false;** var Query = from s in context.EAssets .Include(“Server”).Include(“Type”).Include(“Type.Definition”) where (s.Type.Definition.b_IsScannable == true) && (s.Server.s_Domain == Environment.UserDomainName || s.Server.s_Domain == null) select s; var Entities = Query.ToList(); } 我并不完全理解这个选项的好处,但是我知道在visual studio中标记了所有带有乱码序列后缀的对象,并且使得调试器使用不合理。

GroupBy on complex object(例如List )

使用GroupBy()和Count() > 1我试图在列表中查找我的类的重复实例。 这个类看起来像这样: public class SampleObject { public string Id; public IEnumerable Events; } 这就是我实例化和分组列表的方式: public class Program { private static void Main(string[] args) { var items = new List() { new SampleObject() { Id = “Id”, Events = new List() { “ExampleEvent” } }, new SampleObject() { Id = “Id”, Events = new […]

关于事件的价值/参考类型的问题

在MSDN上,我发现以下内容: public event EventHandler SampleEvent; public void DemoEvent(string val) { // Copy to a temporary variable to be thread-safe. EventHandler temp = SampleEvent; 是参考吗? 如果是这样,我不理解其含义,因为当SampleEvent变为null时,temp也是如此 if (temp != null) temp(this, new MyEventArgs(val)); }

我应该创建一个新的代理实例吗?

这样做有什么意义…… this.myButton.Click += new EventHandler(this.myButton_Clicked); ……对比这个? this.myButton.Click += this.myButton_Clicked; 我怀疑编译器在第二个例子中为我创建了一个新实例。 我确定这是一个新手问题,但谷歌没有发现任何问题。 谁能给我一些见解?

从控制台应用程序重新打开WPF窗口

我想从Console应用程序打开一个WPF窗口。 在提到这篇文章后 ,它运作正常。 问题是:当用户关闭WPF窗口(手动)时,不能再从控制台重新打开它,抛出exception消息:“无法在同一AppDomain中创建多个System.Windows.Application实例。” 这是代码: class Program { static void Main(string[] args) { string input=null; while ((input = Console.ReadLine()) == “y”) { //Works fine at the first iteration, //But failed at the second iteration. StartWpfThread(); } } private static void OpenWindow() { //Exception(Cannot create more than one System.Windows.Application instance in the same AppDomain.) //is thrown […]