我有以下代码:
class Test:
def __init__(self, name):
self.name = name
def __enter__(self):
print(f'entering {self.name}')
def __exit__(self, exctype, excinst, exctb) -> bool:
print(f'exiting {self.name}')
return True
with Test('first') as test:
print(f'in {test.name}')
test = Test('second')
with test:
print(f'in {test.name}')
Run Code Online (Sandbox Code Playgroud)
运行它会产生以下输出:
class Test:
def __init__(self, name):
self.name = name
def __enter__(self):
print(f'entering {self.name}')
def __exit__(self, exctype, excinst, exctb) -> bool:
print(f'exiting {self.name}')
return True
with Test('first') as test:
print(f'in {test.name}')
test = Test('second')
with test:
print(f'in {test.name}')
Run Code Online (Sandbox Code Playgroud)
但我预计它会产生:
entering first
exiting first
entering …Run Code Online (Sandbox Code Playgroud) 我刚刚阅读了Eric Lippert撰写的这篇有趣的文章,十大最差C#特色.接近结束时他说:
在上述结肠之后解决姓名的规则并不充分; 您最终可能需要知道基类是什么,以确定基类是什么.
通过冒号,他指的是继承运算符(例如Dog : Animal).
Eric指的是什么情况?任何人都可以提供代码示例吗?
我负责一个LINQ提供程序,它对C#代码执行一些运行时评估.举个例子:
int? thing = null;
accessor.Product.Where(p => p.anInt == thing.GetValueOrDefault(-1))
Run Code Online (Sandbox Code Playgroud)
目前上述代码由于为thingnull 而无法与我的LINQ提供程序一起使用.
虽然我已经使用C#很长时间了,但我不知道如何实现GetValueOrDefault,因此我应该如何解决这个问题.
所以我的问题是:GetValueOrDefault在调用它的实例为空的情况下如何工作?为什么不NullReferenceException抛出?
接下来的问题:我应该如何复制GetValueOrDefault使用反射的调用,因为我需要处理空值.
我在swift文件中有以下代码:
func testDictionary(dict :Dictionary<String,AnyObject>) {
var str = ""
for var key in dict.keys {
str += key + ":" + dict[key]!.description + "\n"
}
self.alert("Dict", message: str)
}
Run Code Online (Sandbox Code Playgroud)
上面的代码var在for循环中对用户产生警告,即:
Variable 'key' was never mutated; consider changing to 'let' constant
Run Code Online (Sandbox Code Playgroud)
但是,当我更改为时var,let我收到以下错误:
'let' pattern cannot appear nested in an already immutable context
Run Code Online (Sandbox Code Playgroud)
当建议的更正是编译器错误时,为什么会收到警告?
我的proto文件如下:
syntax = "proto3";
option csharp_namespace = "Proto";
message FileListRequest {
repeated File Files = 1;
}
message File {
string Path = 1;
}
message ImageFile {
File File = 1;
Size Size = 2;
bytes Content = 3;
}
message Size {
int32 Width = 1;
int32 Height = 2;
}
message SendNextFile {
}
Run Code Online (Sandbox Code Playgroud)
我用以下命令编译它:
protoc --proto_path=. -I . --python_out=..\..\python\Modules\PreloadingIteratorWrapper\ .\filelist.proto
Run Code Online (Sandbox Code Playgroud)
这将创建以下文件:
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO …Run Code Online (Sandbox Code Playgroud) 我已经定制了一个MSBuild项目,因此默认目标是一个名为"BuildWithExternalReference"的新目标.这个新目标调用另外两个目标; 第一个是自定义目标,称为"BuildExternalReference",它使用外部工具构建DLL.构建的DLL是主项目的引用,它是使用普通的"Build"目标构建的.我已经为'BuildExternalReference'目标设置了Inputs和Outputs属性,因此Inputs引用源文件,输出引用生成的DLL.
在Visual Studio 2012和Visual Studio 2010中,构建在第一次调用时都能正常工作.但是,在后续构建中,如果我更改外部源文件(由"BuildExternalReference"目标输入属性引用),则Visual Studio 2012只会报告"构建:0成功,0失败,1最新,0跳过".Visual Studio 2010继续完美运行.此外,使用MSBuild.exe从命令行构建工作完美.
我知道Visual Studio 2012中的构建系统已经更改,但我无法找到有关对增量构建执行方式的更改的信息.
Visual Studio 2012中是否有任何更改会导致增量构建发生变化?
这是我正在使用的csproj文件的缩减版本:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="BuildWithExternalTool" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ExternalSourceFiles Include="..\ExternalSourceFiles\\*\*.cs" />
<ExternalDll Include="..\ExternalSource\External.dll" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Target Name="BuildExternalTool" Inputs="@(ExternalSourceFiles);" Outputs="@(ExternalDll)">
<Exec Command="C:\External\Path\To\Tool.exe" />
</Target>
<Target Name="BuildWithExternalTool">
<CallTarget Targets="BuildExternalTool" />
<CallTarget Targets="Build" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
2012年11月1日更新
这是一个完整的自包含示例,可以重现该问题:
https://skydrive.live.com/redir?resid=EA1DD6ACA92F9EFF!155&authkey=!ANhuqF_rrCgxpLE
这是一个项目的解决方案.已自定义MSBuildIssueExample\MSBuildIssueExample.csproj文件,因此存在自定义默认目标.此默认目标调用自定义目标(称为"ExternalTool"),然后调用默认的Build目标.
自定义ExternalTool目标会写出一些消息以确保它正常工作,并且还会通过MSBuildIssueExample\ExternalTool\Output.txt文件复制MSBuildIssueExample\ExternalTool\Input.txt文件的内容.
Input.txt文件是ExternalTool目标的输入,Output.txt是输出.
要重新创建问题,请按照下列步骤操作:
1)在指定版本的Visual Studio中打开解决方案
2)构建解决方案一次,以确保输出相对于输入是最新的
3)修改MSBuildIssueExample\ExternalTool\Input.txt,使其内容与Output.txt不匹配
4)再次建造
在Visual Studio 2010中执行此过程时,将再次调用ExternalTool目标,并将Input.txt文件复制到Output.txt上.
在Visual Studio 2012中执行此过程时,即使输入比输出新,也不会调用ExternalTool目标,因此Input.txt的内容不会写入Output.txt.
但是,如果您执行Rebuild(而不仅仅是Build),则两个版本的Visual Studio都按预期工作.
我在iOS项目中使用sqlite.但是sqlite3_column_count总是返回0,即使我确定查询确实返回了一些列(我甚至认为SQL中的SELECT查询不可能有零输出列).奇怪的是,这种行为会改变,具体取决于我链接的库的版本,特别是该库使用的编译时选项.
这些是用于库版本的编译时选项,它不起作用:
COMPILER=clang-8.0.0 (clang-800.2.34)
ENABLE_API_ARMOR
ENABLE_FTS3
ENABLE_FTS3_PARENTHESIS
ENABLE_JSON1
ENABLE_LOCKING_STYLE=1
ENABLE_RTREE
ENABLE_UPDATE_DELETE_LIMIT
HAS_CODEC
HAVE_ISNAN
MAX_MMAP_SIZE=20971520
OMIT_AUTORESET
OMIT_BUILTIN_TEST
OMIT_LOAD_EXTENSION
SYSTEM_MALLOC
THREADSAFE=2
Run Code Online (Sandbox Code Playgroud)
以下是适用版本的标志:
COMPILER=clang-8.0.0
SYSTEM_MALLOC
THREADSAFE=1
Run Code Online (Sandbox Code Playgroud)
什么可能导致这种行为?
更新2016/12/01
这是一个可用于重新创建问题的项目:https://github.com/iannewson/Stackoverflow40895740.git
ViewController.swift包含以下代码:
Test.doDbStuff()
Run Code Online (Sandbox Code Playgroud)
此功能包含以下内容:
public static func doDbStuff() {
do {
var db :OpaquePointer?
let dbPath = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent("\(Date.init().timeIntervalSince1970)".replacingOccurrences(of: ".", with: "") + ".db")
.path
var returnCode :Int32 = sqlite3_open(dbPath, &db)
if SQLITE_OK != returnCode {
preconditionFailure("Failed to open db")
}
var stmt :OpaquePointer? …Run Code Online (Sandbox Code Playgroud) 我是try/do(或trier/doer)模式的粉丝,最好在C#中使用out参数实现,例如:
DateTime date;
if (DateTime.TryParse("2012-06-18", out date))
{
//Do something with date
}
Run Code Online (Sandbox Code Playgroud)
我正在开发一个Java 1.5项目,为此我正在使用一个名为TryResult的新类来实现try/do模式,该类是从实现try/do模式的任何方法返回的:
public class TryResult<ResultType> {
private boolean mSuccess = false;
private ResultType mResult = null;
public TryResult(boolean success, ResultType result) {
super();
this.mSuccess = success;
this.mResult = result;
}
public boolean isSuccess() {
return mSuccess;
}
public ResultType getResult() {
return mResult;
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但我会将此代码移植到使用J2ME的不同平台,因此泛型不可用.
我目前的选择是从TryResult上面的类中删除泛型并使用普通的旧Object和铸造,或者为我最终使用的类型创建一个新类(例如StringTryResult).
有没有更好的方法在J2ME/Java 1.3上实现这种模式?
我可以在SQL IN子句中放置任何值来保证该子句的计算结果为false吗?
SELECT *
FROM Products
WHERE ProductID IN (???)
Run Code Online (Sandbox Code Playgroud)
有什么我可以替换??? 保证不会返回任何行?
如何为布尔值指定与其他类型的其他格式字符串一致的格式字符串?
给出以下代码:
double d = Math.PI;
DateTime now = DateTime.Now;
bool isPartyTime = true;
string result = $"{d:0.0}, {now:HH:mm}, time to party? {isPartyTime}";
Run Code Online (Sandbox Code Playgroud)
我可以为每个原始类型指定一种格式,但bool看起来除外。我知道我能做到:
string result = $"{d:0.0}, {now:HH:mm}, time to party? {(isPartyTime ? "yes!" : "no")}";
Run Code Online (Sandbox Code Playgroud)
但这仍然与其他类型不一致。
有没有一种方法可以使插值字符串中的布尔值保持一致?
PS我确实搜索了包含此链接的答案:
/sf/ask/tagged/c/%23+string-interpolation+boolean
令人惊讶的是结果为零。