小编Sel*_*enç的帖子

为什么我不能使用索引器将项添加到通用列表?

这是我今天看到的一个奇怪的情况:

我有一个通用列表,我希望添加项目到我的列表与它的索引器像这样:

List<string> myList = new List<string>(10);
myList[0] = "bla bla bla...";
Run Code Online (Sandbox Code Playgroud)

当我尝试这个时,我得到了 ArgumentOutOfRangeException

在此输入图像描述

然后我看了List<T>索引器集方法,这里是:

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries"),    __DynamicallyInvokable] 
  set
  {
    if ((uint) index >= (uint) this._size)  
      ThrowHelper.ThrowArgumentOutOfRangeException();  //here is exception
    this._items[index] = value;
    ++this._version;
  }
Run Code Online (Sandbox Code Playgroud)

还看了一下Add方法:

[__DynamicallyInvokable]
public void Add(T item)
{
  if (this._size == this._items.Length)
    this.EnsureCapacity(this._size + 1);
  this._items[this._size++] = item;
  ++this._version;
}
Run Code Online (Sandbox Code Playgroud)

现在,我看到两种方法都使用相同的方式:

// Add() Method
this._items[this._size++] = item; 
// Setter method
this._items[index] = value;
Run Code Online (Sandbox Code Playgroud)

_items是一个类型的数组 …

.net c# arrays generics

8
推荐指数
3
解决办法
1806
查看次数

如何在ASP.NET MVC中应用长轮询技术?

我搜索了很多关于轮询技术但我找不到任何关于如何在asp.net mvc中应用这种技术的内容.有很多文章和文档,但大多数关于PHP和ajax.

我希望在两个地方使用这个技术和我的项目,一个是像twitter这样的推文系统,另一个是聊天系统.我很好奇在MVC中应用这种技术的最佳方法是什么?我必须使用SignalR吗?这是最好的选择吗?

如果你能给我一些样品或文件,那就太好了,谢谢!

c# asp.net-mvc long-polling asp.net-mvc-4 signalr

7
推荐指数
2
解决办法
1万
查看次数

从Explorer窗口获取文件夹路径

我有一个指向打开的资源管理器窗口的指针,我想知道它的完整路径.

例如:

int hWnd = FindWindow(null, "Directory");
Run Code Online (Sandbox Code Playgroud)

但是现在,如何获取目录的完整路径就好了 "C:\Users\mm\Documents\Directory"

.net c# winapi

7
推荐指数
1
解决办法
4687
查看次数

LINQ to Entities无法识别方法Replace?

如何在实体框架中使用replace方法.我使用以下代码但遇到错误.

using (SepasProjectEntities sp=new SepasProjectEntities())
{
var query = (from p in sp.HISAccidentLocationMappings
                         where p.Name.Replace('y','x').Contains(txt1.Text)
                         select p
                           ).ToList();
}
Run Code Online (Sandbox Code Playgroud)

System.Data.Entity.dll中出现"System.NotSupportedException"类型的异常,但未在用户代码中处理

附加信息:LINQ to Entities无法识别方法'System.String Replace(Char,Char)'方法,并且此方法无法转换为存储表达式.

c# asp.net entity-framework

7
推荐指数
2
解决办法
5178
查看次数

在Batch方法中使用Select(x => x)的目的是什么?

我正在查看Batch方法的源代码,我已经看到了这个:

// Select is necessary so bucket contents are streamed too
yield return resultSelector(bucket.Select(x => x));
Run Code Online (Sandbox Code Playgroud)

有一条我不太明白的评论.我已经测试了这种方法而没有使用Select它并且运行良好.但似乎有些东西我不知道.我想不出任何必要的例子,那么Select(x => x)在这里使用的实际目的是什么?

以下是完整的源代码供参考:

private static IEnumerable<TResult> BatchImpl<TSource, TResult>(
        this IEnumerable<TSource> source,
        int size,
        Func<IEnumerable<TSource>, TResult> resultSelector)
    {
        TSource[] bucket = null;
        var count = 0;

        foreach (var item in source)
        {
            if (bucket == null)
                bucket = new TSource[size];

            bucket[count++] = item;

            // The bucket is fully buffered before it's yielded
            if (count != size)
                continue;

            // …
Run Code Online (Sandbox Code Playgroud)

c# linq

7
推荐指数
1
解决办法
248
查看次数

为什么x = x + 100的处理方式不同于x + = 100,它们编译为相同的IL?

我们知道这两个加法语句是等价的,并编译为相同的IL代码:

int x = 100;

x += 100;
x = x + 100;
Run Code Online (Sandbox Code Playgroud)

但是,当需要明确的演员表时我发现​​了一些奇怪的东西:

byte b = 100;

b += 200; // Compiles (1)
b = b + 200; // Cannot implicitly convert int to byte (2)
b = (byte) (b + 200); // Compiles (3)
Run Code Online (Sandbox Code Playgroud)

很明显,为什么第二个语句需要显式转换,因为加法的结果是整数.但对我来说奇怪的是第一个声明.它编译为与第三个语句完全相同的IL,因此看起来编译器为我们添加了一个应该是显式的强制转换.但它不能在第二个声明中这样做.

这对我来说似乎是矛盾的,因为我希望第一个语句等同于第二个语句并且永远不会编译,所以它为什么要编译?

注:当从需要有明确的转换这并不编译longint:

int x = 100;
long y = 200;

x += y;
Run Code Online (Sandbox Code Playgroud)

c# casting

7
推荐指数
1
解决办法
211
查看次数

为什么Dictionary <T,V>显式实现ICollection <KeyValuePair <T,V >>,当它已被IDictionary <T,V>继承时

最近我的朋友问我为什么在它已经被继承时Dictionary<T, V>显式实现?ICollection<KeyValuePair<T, V>>IDictionary<T,V>

我意识到我也不知道答案.以下是官方文档的链接:

Dictionary<T, V>- http://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx IDictionary<T,V> - http://msdn.microsoft.com/en-us/library/s4ys34ea(v=vs. 110)的.aspx

有没有具体的理由为什么这样做?是否有特定的架构模式或任何东西?

.net c# dictionary

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

在安装Roslyn之后,为什么我的IDE会抱怨新语法?

我正在使用Visual Studio 2013,我写这个简单的代码:

class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine(string error = "Hello world!");
    }
}
Run Code Online (Sandbox Code Playgroud)

显然这不是一个有效的C#代码,但奇怪的部分是即使我看到两个错误,代码正在编译并正常工作:

在此输入图像描述

我认为migth是相关的Roslyn 因为我安装了Roslyn User Preview和其他扩展,但我正在使用的项目模板是标准Console Application模板.那么,为什么这个代码正在编译,即使有三个编译器错误?我试过这个VS 2012并且它没有编译.是编译器错误,还是在下一个版本中有效C#

这是我看到的错误列表VS 2012:

在此输入图像描述

但肯定没有错误VS 2013.

注意:我不确定它是否相关,但我也在使用Resharper.

c# resharper compiler-errors roslyn visual-studio-2013

6
推荐指数
2
解决办法
299
查看次数

为什么将泛型参数指定为接口不是带有类约束的错误?

如果我有这样的通用方法:

static void Foo<T>() where T : class
{

}
Run Code Online (Sandbox Code Playgroud)

例如,我可以通过指定接口类型来调用它 ICollection<int>

Foo<ICollection<int>>();
Run Code Online (Sandbox Code Playgroud)

现在假设我有一个实现的结构ICollection<int>:

struct Bar : ICollection<int>
Run Code Online (Sandbox Code Playgroud)

我不能明确地将它指定为类型参数,但如果我有一个ICollection<int>具有基础类型的类型的变量Bar,并且更改我的泛型方法以获取类型的参数T,我可以这样做:

static void Foo<T>(T arg) where T : class
{

}

ICollection<int> bar = new Bar();
Foo <ICollection<int>>(bar);
Run Code Online (Sandbox Code Playgroud)

如您所见,它完全忽略了通用约束.所以我的问题是为什么在我们有class约束时允许将接口指定为类型参数?

c# generics

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

使用"部分"时为什么类级"不安全"修饰符不一致?

我已经注意到unsafe在类级别上对部分类使用修饰符时的某种行为,我希望得到一些澄清.

我一直在研究一个相当大的包装器,为了理智,我使用partial修饰符分割多个文件.包装器大量使用unsafe指针,因此我选择在类级别上简单地声明它以覆盖其中的所有内容.

public static unsafe partial class Ruby
{
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static VALUE CLASS_OF(VALUE obj) => ((RBasic*) obj)->klass;
}
Run Code Online (Sandbox Code Playgroud)

在另一个文件中:

public static unsafe partial class Ruby
{
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static void* DATA_PTR(VALUE obj) => ((RData*) obj)->data;
}
Run Code Online (Sandbox Code Playgroud)

unsafe修改需要每个部分的声明,以使不安全的代码被"允许"和编译,这是可以理解的,我希望,对于部分类的类声明将需要完全匹配.

但是使用那个逻辑,我也被允许有另一个不是的文件unsafe:

[SuppressUnmanagedCodeSecurity]
public static partial class Ruby
{
    [DllImport(RUBY_LIBRARY, CallingConvention = CallingConvention.Cdecl)]
    public static extern VALUE rb_ivar_get(VALUE obj, ID name);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我不使用unsafe修饰符,它是完全可以接受的(显然在这个文件中没有不安全的代码).

我是什么希望得到澄清为什么这允许.每个分类的类声明不应该完全匹配吗?改变/不包括任何其他类改性剂是不允许的,例如private,public,abstract等等,所以这是为什么好吗用unsafe …

c# unsafe

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