这是我今天看到的一个奇怪的情况:
我有一个通用列表,我希望添加项目到我的列表与它的索引器像这样:
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是一个类型的数组 …
我搜索了很多关于轮询技术但我找不到任何关于如何在asp.net mvc中应用这种技术的内容.有很多文章和文档,但大多数关于PHP和ajax.
我希望在两个地方使用这个技术和我的项目,一个是像twitter这样的推文系统,另一个是聊天系统.我很好奇在MVC中应用这种技术的最佳方法是什么?我必须使用SignalR吗?这是最好的选择吗?
如果你能给我一些样品或文件,那就太好了,谢谢!
我有一个指向打开的资源管理器窗口的指针,我想知道它的完整路径.
例如:
int hWnd = FindWindow(null, "Directory");
Run Code Online (Sandbox Code Playgroud)
但是现在,如何获取目录的完整路径就好了 "C:\Users\mm\Documents\Directory"
如何在实体框架中使用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)'方法,并且此方法无法转换为存储表达式.
我正在查看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) 我们知道这两个加法语句是等价的,并编译为相同的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,因此看起来编译器为我们添加了一个应该是显式的强制转换.但它不能在第二个声明中这样做.
这对我来说似乎是矛盾的,因为我希望第一个语句等同于第二个语句并且永远不会编译,所以它为什么要编译?
注:当从需要有明确的转换这并不编译long到int:
int x = 100;
long y = 200;
x += y;
Run Code Online (Sandbox Code Playgroud) 最近我的朋友问我为什么在它已经被继承时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
有没有具体的理由为什么这样做?是否有特定的架构模式或任何东西?
我正在使用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.
如果我有这样的通用方法:
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约束时允许将接口指定为类型参数?
我已经注意到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# ×10
.net ×3
generics ×2
arrays ×1
asp.net ×1
asp.net-mvc ×1
casting ×1
dictionary ×1
linq ×1
long-polling ×1
resharper ×1
roslyn ×1
signalr ×1
unsafe ×1
winapi ×1