小编Mr *_*son的帖子

程序不包含适用于入口点的静态"Main"方法

突然,我的整个项目完全停止编译,显示以下消息:

程序'path_to_obj_project_folder'不包含适用于入口点的静态'Main'方法

我没有对项目属性进行任何更改,只添加了一些类,将其他一些类移动到文件夹中.它是一个WPF应用程序项目,所以应该没问题.入口点应该是它,文件App.xaml根本没有修改:(

我该怎么办才能让它再次发挥作用?

c# wpf

164
推荐指数
5
解决办法
13万
查看次数

为什么与其他结构相比,DateTime的GetHashCode()方法编译方式不同?

请考虑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)

.net c# cil

10
推荐指数
1
解决办法
399
查看次数

在C#中声明接口继承

我对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

.net c#

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

为什么编译器选择使用IEnumerable覆盖IEnumerable <T>?

考虑以下两种扩展方法:

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)

.net c#

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

Type int []如何实现尚不存在的接口(对我而言)?

今天我在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,事实证明我确实安装了它.

.net c#

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

SQL 服务器中 %%physloc%% 的行总是具有相同的值吗?

我一直在探索%%physloc%%伪列作为行标识符的实际用途。不幸的是,我一直无法找到有关%%physloc%%. 我需要知道这个值是否会改变。

我做了一些测试,它看起来很静态。即使我创建了我的数据库的备份并在不同的服务器上恢复%%physloc%%,每一行的 保持不变。

谁能解释一下这是否可靠和/或提供文档链接?非常感激。

sql-server

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

如何在抛出异常时阻止调试器进入我的方法?

如何在抛出异常时阻止调试器输入我的方法,而是在方法的调用站点上显示异常?

例如,如果一个代码导致从mscorlib抛出异常,则调试器(显然)不会将它们带入非用户代码以显示异常的源,只显示调用站点的异常.

换句话说,这是默认行为:

默认行为

这是我想要的行为:

期望的行为

我试过添加[DebuggerNonUserCode][DebuggerStepThrough]属性到我的Fail()方法,但没有运气.

c# visual-studio visual-studio-debugging visual-studio-2015

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

EntityFramework 6.1.3:类型'IdentityDbContext <>'在未引用的程序集中定义

我正在研究一个项目net45.在解决方案中,我有两个项目.一个是MVC webapp(使用EF),另一个是服务(使用DBContextwebapp中定义).奇怪的是,我可以毫无问题地编译我的webapp,但是当我重建我的服务项目时,我收到了这个错误:

"IdentityDbContext <>"类型在未引用的程序集中定义.您必须添加对程序集"Microsoft.AspNet.Identity.EntityFramework,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"的引用

我正在引用与我在webapp中相同的EF版本的库.请问有谁请告诉我如何解决这个问题?

c# entity-framework

4
推荐指数
1
解决办法
1266
查看次数

使用Type.GetMethod(字符串名称,类型[]类型)的意外行为

请考虑以下代码:

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)

.net c#

3
推荐指数
1
解决办法
78
查看次数