我刚刚遇到一个奇怪的错误:
private bool GetBoolValue()
{
//Do some logic and return true or false
}
Run Code Online (Sandbox Code Playgroud)
然后,在另一种方法中,这样的事情:
int? x = GetBoolValue() ? 10 : null;
Run Code Online (Sandbox Code Playgroud)
很简单,如果方法返回true,则为Nullable intx 赋值10 .否则,将null赋给nullable int.但是,编译器抱怨:
错误1无法确定条件表达式的类型,因为
int和之间没有隐式转换<null>.
我疯了吗?
这是设置.假设我有一些需要服务实例的动作过滤器:
public interface IMyService
{
void DoSomething();
}
public class MyService : IMyService
{
public void DoSomething(){}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个需要该服务实例的ActionFilter:
public class MyActionFilter : ActionFilterAttribute
{
private IMyService _myService; // <--- How do we get this injected
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_myService.DoSomething();
base.OnActionExecuting(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
在MVC 1/2中,将依赖关系注入动作过滤器是一个痛苦的屁股.最常见的方法是使用自定义操作调用因为在这里可以看到:http://www.jeremyskinner.co.uk/2008/11/08/dependency-injection-with-aspnet-mvc-action-filters/的这种解决方法背后的主要动机是因为以下方法被认为是与容器的草率和紧密耦合:
public class MyActionFilter : ActionFilterAttribute
{
private IMyService _myService;
public MyActionFilter()
:this(MyStaticKernel.Get<IMyService>()) //using Ninject, but would apply to any container
{
}
public MyActionFilter(IMyService myService)
{
_myService = myService;
} …Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc dependency-injection actionfilterattribute asp.net-mvc-3
通常,在使用条件运算符时,这是语法:
int x = 6;
int y = x == 6 ? 5 : 9;
Run Code Online (Sandbox Code Playgroud)
没有什么花哨的,非常直接的.
现在,让我们在将Lambda分配给Func类型时尝试使用它.让我解释:
Func<Order, bool> predicate = id == null
? p => p.EmployeeID == null
: p => p.EmployeeID == id;
Run Code Online (Sandbox Code Playgroud)
这是相同的语法,应该工作吗?对?出于某种原因,没有.编译器提供了这个不错的神秘消息:
错误1无法确定条件表达式的类型,因为"lambda表达式"和"lambda表达式"之间没有隐式转换
然后我继续改变语法,这样它确实有效:
Func<Order, bool> predicate = id == null
? predicate = p => p.EmployeeID == null
: predicate = p => p.EmployeeID == id;
Run Code Online (Sandbox Code Playgroud)
我只是好奇为什么它不能以第一种方式工作?
(旁注:我最终不需要这段代码,因为我发现在将int值与null进行比较时,只需使用object.Equals)
可能重复:
C#可以将值类型与null进行比较
我在多线程环境中处理Windows应用程序,有时会得到异常"在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke." 所以我想我只是添加这行代码:
if(this.Handle != null)
{
//BeginInvokeCode
}
Run Code Online (Sandbox Code Playgroud)
但这并没有解决问题.所以我进一步挖掘,并意识到IntPtr(Form.Handle所属的类型)是一个不能为空的结构.这是有效的修复:
if(this.Handle != IntPtr.Zero)
{
//BeginInvokeCode
}
Run Code Online (Sandbox Code Playgroud)
那么它打击了我,为什么它甚至在我检查它为null时编译?所以我决定自己尝试一下:
public struct Foo { }
Run Code Online (Sandbox Code Playgroud)
然后:
static void Main(string[] args)
{
Foo f = new Foo();
if (f == null) { }
}
Run Code Online (Sandbox Code Playgroud)
并且肯定它没有编译说"错误1运算符'=='不能应用于'ConsoleApplication1.Foo'和'''类型的操作数.好的,那么我开始查看IntPtr的元数据,并开始将所有内容添加到IntPtr结构中的Foo结构(ISerializable,ComVisible),但没有任何帮助.最后,当我添加运算符重载==和!=时,它工作:
[Serializable]
[ComVisible(true)]
public struct Foo : ISerializable
{
#region ISerializable Members
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
throw new NotImplementedException();
}
#endregion
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return …Run Code Online (Sandbox Code Playgroud) Visual Studio中抱怨:警告1名设计者必须创建类型"RentalEase.CustomBindingNavForm"的一个实例,但它不能因为类型声明为抽象的.
Visual Studio不允许我访问表单的Designer.该类已经实现了CustomBindingNavForm中的所有抽象方法.CustomBindingNavForm提供了一些具体和抽象的函数.
有没有解决的办法?
这是班级:
public abstract class CustomBindingNavForm : SingleInstanceForm {
//Flags for managing BindingSource
protected bool isNew = false;
protected bool isUpdating = false;
/// <summary>
/// This is so that when a new item is added, it sets isNew and firstPass to true. The Position Changed Event will look for
/// firstPass and if it is true set it to false. Then on the next pass, it will see it's false and set isNew to …Run Code Online (Sandbox Code Playgroud) async/await在C#中使用时,通常的规则是避免,async void因为这几乎是火,忘记了,Task如果没有从方法发送返回值,则应该使用.说得通.但奇怪的是,在本周早些时候,我正在为async我编写的一些方法编写一些单元测试,并注意到NUnit建议将async测试标记为void或者返回Task.然后我试了一下,果然,它奏效了.这看起来很奇怪,因为nunit框架如何能够运行该方法并等待所有异步操作完成?如果它返回Task,它可以等待任务,然后做它需要做的事情,但是如果它返回void它怎么能把它拉下来呢?
所以我破解了源代码并找到了它.我可以在一个小样本中重现它,但我根本无法理解它们正在做什么.我想我对SynchronizationContext以及它是如何工作的了解不够.这是代码:
class Program
{
static void Main(string[] args)
{
RunVoidAsyncAndWait();
Console.WriteLine("Press any key to continue. . .");
Console.ReadKey(true);
}
private static void RunVoidAsyncAndWait()
{
var previousContext = SynchronizationContext.Current;
var currentContext = new AsyncSynchronizationContext();
SynchronizationContext.SetSynchronizationContext(currentContext);
try
{
var myClass = new MyClass();
var method = myClass.GetType().GetMethod("AsyncMethod");
var result = method.Invoke(myClass, null);
currentContext.WaitForPendingOperationsToComplete();
}
finally
{
SynchronizationContext.SetSynchronizationContext(previousContext);
}
}
}
public class MyClass
{
public async void …Run Code Online (Sandbox Code Playgroud) 我正在使用VS2008,已经使用了很长一段时间了,因为我讨厌在开发时使用鼠标,我总是使用F6构建解决方案,或者Shift+ F6 来构建当前项目.奇怪的是,由于一些奇怪的原因,它在过去的几天里停止了工作.事实上,当我下拉Build菜单时,在"Build MyProject"旁边,菜单上不再有" Shift+ F6"快捷键了?!?有没有人经历过这个?我需要更改设置吗?
使用Razor View Engine,只要您将字符串直接输出到页面,它就是HTML编码的.例如:
@"<p>Hello World</p>"
Run Code Online (Sandbox Code Playgroud)
实际上将输出到页面:
<p>Hello World </p>
Run Code Online (Sandbox Code Playgroud)
哪个会在浏览器中显示为:
<p> Hello World </ p>
这里的问题是,在创建Html帮助程序时,到目前为止,使用旧的aspx视图引擎,我只返回一个字符串,并将其输出到浏览器:
<%= Html.MyCoolHelperMethod(); %>
Run Code Online (Sandbox Code Playgroud)
所以我的问题基本上就是这个.我这样做:
public static IHtmlString MyCoolHelperMethod(this HtmlHelper helper)
{
return new helper.Raw("<p>Hello World</p>");
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以在我的cshtml中执行此操作:
@Html.MyCoolHelperMethod();
Run Code Online (Sandbox Code Playgroud)
或者我这样做:
public static string MyCoolHelperMethod(this HtmlHelper helper)
{
return "<p>Hello World</p>";
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我需要在我的cshtml中完成工作:
@Html.Raw(Html.MyCoolHelperMethod());
Run Code Online (Sandbox Code Playgroud)
显然,第一种方法使视图看起来更清晰,但我只是想知道普通模式是否实际上是帮助者返回IHtmlString并且我过去做错了.
在您看来,从函数返回新分配的内存流或将其传递给函数是否更好?例如,
void Foo(MemoryStream m)
{
m.Write(somebuffer, 0, somebuffer.Length);
}
Run Code Online (Sandbox Code Playgroud)
要么
void MemoryStream Foo()
{
MemoryStream retval = new MemoryStream();
retval.Write(somebuffer, 0, somebuffer.Length);
return retval;
}
Run Code Online (Sandbox Code Playgroud) 这可能很简单,但我自己找不到答案:(
基本上,我想要的是,给定这个字符串:
" http://www.google.com/search?hl=en&q=c# objects"
我想要这个输出:
http://www.google.com/search?hl=en&q=c%23+objects
我确信在框架中埋藏了一些辅助类,它可以解决这个问题,但是我找不到它.
编辑:我应该补充一点,这是一个Winforms应用程序.
c# ×10
.net ×4
asp.net-mvc ×2
abstract ×1
async-await ×1
encoding ×1
html-encode ×1
lambda ×1
null ×1
nullable ×1
nunit ×1
razor ×1
struct ×1
url ×1
winforms ×1