突然,我的整个项目完全停止编译,显示以下消息:
程序'path_to_obj_project_folder'不包含适用于入口点的静态'Main'方法
我没有对项目属性进行任何更改,只添加了一些类,将其他一些类移动到文件夹中.它是一个WPF应用程序项目,所以应该没问题.入口点应该是它,文件App.xaml根本没有修改:(
我该怎么办才能让它再次发挥作用?
请考虑C#中的以下方法:
public static int HashCodeFunction(Decimal value)
{
return value.GetHashCode();
}
public static int HashCodeFunction(Int64 value)
{
return value.GetHashCode();
}
public static int HashCodeFunction(DateTime value)
{
return value.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)
让我们看一下编译器生成的指令:
对于Decimal方法:
ldarga.s Parameter:System.Decimal value
call Method:System.Decimal.GetHashCode()
ret
Run Code Online (Sandbox Code Playgroud)
对于Int64方法:
ldarga.s Parameter:System.Int64 value
call Method:System.Int64.GetHashCode()
ret
Run Code Online (Sandbox Code Playgroud)
对于DateTime方法:
ldarga.s Parameter:System.DateTime value
constrained Type:System.DateTime
callvirt Method:System.Object.GetHashCode()
ret
Run Code Online (Sandbox Code Playgroud)
考虑到结构有一个重写方法,为什么该DateTime.GetHashCode()方法被视为虚拟调用?Object.GetHashCode()GetHashCode()DateTime
此外,我可以System.DateTime.GetHashCode()使用以下代码创建一个直接调用该方法而无需虚拟调用的方法:
DynamicMethod myDynamicMethod = new DynamicMethod("myHashCodeMethod", typeof(int), new[] { typeof(DateTime) });
ILGenerator gen = …Run Code Online (Sandbox Code Playgroud) 我对C#中接口的继承语法有点不清楚.
例如:
public interface IFoo
{
}
public interface IBar : IFoo
{
}
Run Code Online (Sandbox Code Playgroud)
这有什么区别:
public interface IQux : IBar
{
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
public interface IQux : IBar, IFoo
{
}
Run Code Online (Sandbox Code Playgroud)
或者,对于一个真实世界的例子,为什么ICollection<T>声明如下:
public interface ICollection<T> : IEnumerable<T>, IEnumerable
Run Code Online (Sandbox Code Playgroud)
而不是这个:
public interface ICollection<T> : IEnumerable<T>
Run Code Online (Sandbox Code Playgroud)
鉴于IEnumerable<T>已经继承了IEnumerable?
考虑以下两种扩展方法:
using System;
using System.Collections.Generic;
using System.Linq;
public static class Extensions
{
public static bool Contains(this IEnumerable self, object obj)
{
foreach (object o in self)
{
if (Object.Equals(o, obj))
{
return true;
}
}
return false;
}
public static bool ContainsEither<T>(this IEnumerable<T> self, T arg1, T arg2)
{
return self.Contains(arg1) || self.Contains(arg2);
}
}
Run Code Online (Sandbox Code Playgroud)
当我编写第二个方法时,我打算调用泛型LINQ Enumerable.Contains<T>方法(从用法推断出类型参数).但是,我发现它实际上是调用第一个方法(我的自定义Contains()扩展方法.当我注释掉我的Contains()方法时,第二个方法编译好,使用该Enumerable.Contains<T>()方法.
我的问题是,为什么编译器选择带有参数的Contains()非泛型IEnumerable参数的方法?我希望它能够选择,因为它比派生更多.Enumerable.Contains<T>()IEnumerable<T>Enumerable.Contains<T>()IEnumerable<T>IEnumerable
更新:感谢Jon Skeet的出色答案.知道设计师选择这种方式的原因会很有趣.我花了一些时间探索这个问题的重要事项,我想到了一个(授予它有点伸手可及)
using System;
using System.Collections.Generic; …Run Code Online (Sandbox Code Playgroud) 今天我在Visual Studio 2010(.NET Framework 4.0版)中测试了以下代码
Type[] interfaces = typeof(int[]).GetInterfaces();
Run Code Online (Sandbox Code Playgroud)
我很震惊地在列表中找到这两个:
System.Collections.Generic.IReadOnlyList`1 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]],mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089
System.Collections.Generic.IReadOnlyCollection`1 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]],mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089
我在与框架4.5+安装环境中使用这两个接口之前,并根据文件,双方 的他们4.5创建的.这不能在我的环境中编译:
System.Collections.Generic.IReadOnlyList<int> list = new int[3];
Run Code Online (Sandbox Code Playgroud)
名称空间'System.Collections.Generic'中不存在类型或命名空间名称'IReadOnlyCollection'(您是否缺少程序集引用?)
当我尝试这个:
int[] array = new int[3];
Type iReadOnlyCollection = Type.GetType("System.Collections.Generic.IReadOnlyCollection`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
int count = (int)iReadOnlyCollection.GetProperty("Count").GetValue(array, null);
Run Code Online (Sandbox Code Playgroud)
count正如预期的那样等于3.这里发生了什么?
编辑:我不认为我的机器上安装了框架4.5:
编辑2:谢谢@ScottChamberlain,事实证明我确实安装了它.
我一直在探索%%physloc%%伪列作为行标识符的实际用途。不幸的是,我一直无法找到有关%%physloc%%. 我需要知道这个值是否会改变。
我做了一些测试,它看起来很静态。即使我创建了我的数据库的备份并在不同的服务器上恢复%%physloc%%,每一行的 保持不变。
谁能解释一下这是否可靠和/或提供文档链接?非常感激。
如何在抛出异常时阻止调试器输入我的方法,而是在方法的调用站点上显示异常?
例如,如果一个代码导致从mscorlib抛出异常,则调试器(显然)不会将它们带入非用户代码以显示异常的源,只显示调用站点的异常.
换句话说,这是默认行为:
这是我想要的行为:
我试过添加[DebuggerNonUserCode]和[DebuggerStepThrough]属性到我的Fail()方法,但没有运气.
我正在研究一个项目net45.在解决方案中,我有两个项目.一个是MVC webapp(使用EF),另一个是服务(使用DBContextwebapp中定义).奇怪的是,我可以毫无问题地编译我的webapp,但是当我重建我的服务项目时,我收到了这个错误:
"IdentityDbContext <>"类型在未引用的程序集中定义.您必须添加对程序集"Microsoft.AspNet.Identity.EntityFramework,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"的引用
我正在引用与我在webapp中相同的EF版本的库.请问有谁请告诉我如何解决这个问题?
请考虑以下代码:
public static class FooHelpers
{
public static void Foo(int bar)
{
//...
}
public static void Foo(uint bar)
{
//...
}
public static void Foo(long bar)
{
//...
}
public static void Foo(ulong bar)
{
//...
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有一些给出类型的反射代码,并检查是否存在具有Foo给定类型的参数的方法.如果不存在这样的Foo方法,我的程序需要跳过一步.这是一种实现此目的的方法:
public static MethodInfo GetFooMethodIfExists(Type parameterType)
{
return typeof(FooHelpers).GetMethod("Foo", new Type[] { parameterType });
}
Run Code Online (Sandbox Code Playgroud)
似乎是一个合理的解决方案,不是吗?根据以下文件Type.GetMethod(string name, Type[] types):
// Returns:
// A System.Reflection.MethodInfo object representing the public method whose
// parameters match the specified …Run Code Online (Sandbox Code Playgroud)