[解決済み】C#や.NETで見た最も奇妙なコーナーケースは何ですか?[解決済み]
質問
角材を集めたり ブレイン・ティーザー また、いつでも聞いてください。このページではC#言語の断片的な情報しか扱っていませんが、.NETのコアな部分も興味深いと思っています。例えば、このページには載っていないのですが、信じられないようなことがあります。
string x = new string(new char[0]);
string y = new string(new char[0]);
Console.WriteLine(object.ReferenceEquals(x, y));
私はこれがFalseと表示されることを期待します - 結局のところ、"new" (参照タイプで) 常に は新しいオブジェクトを作成しますよね?C#とCLIの両方の仕様では、そうなっています。 しかし、このケースではそうではありません。私がテストしたフレームワークのすべてのバージョンで、Trueと表示された。(確かにMonoでは試していないのですが...)
はっきりさせておきたいのは、これは私が探している種類のものの一例に過ぎないということです。私は特にこの奇妙さについての議論や説明を探していたわけではありません。(これは通常の文字列の相互作用とは異なります。特に、文字列の相互作用は通常コンストラクタが呼ばれたときには起こりません)。私は本当に似たような奇妙な動作について尋ねていたのです。
他に何か逸品が潜んでいませんか?
解決方法は?
これは以前にも紹介したと思いますが、私はこの面白さが好きです - これを突き止めるには、いくつかのデバッグが必要でした (元のコードは明らかにもっと複雑で微妙なんですが...)
static void Foo<T>() where T : new()
{
T t = new T();
Console.WriteLine(t.ToString()); // works fine
Console.WriteLine(t.GetHashCode()); // works fine
Console.WriteLine(t.Equals(t)); // works fine
// so it looks like an object and smells like an object...
// but this throws a NullReferenceException...
Console.WriteLine(t.GetType());
}
それで、Tは...?
答え:任意
Nullable<T>
- というように
int?
. すべてのメソッドはオーバーライドされますが、GetType()はオーバーライドできません。したがって、object.GetType()を呼び出すために、object(つまりnull)にキャスト(ボックス化)されます・・・これはnullを呼び出します; -p。
アップデート:陰謀はますます複雑に... Ayende Rahienが投げ捨てたのは
自身のブログで、同様の挑戦をしています。
ただし
where T : class, new()
:
private static void Main() {
CanThisHappen<MyFunnyType>();
}
public static void CanThisHappen<T>() where T : class, new() {
var instance = new T(); // new() on a ref-type; should be non-null, then
Debug.Assert(instance != null, "How did we break the CLR?");
}
しかし、それは破ることができる! リモートのようなもので使われるのと同じインダイレクトを使います。警告 - 以下は 純然たる悪 :
class MyFunnyProxyAttribute : ProxyAttribute {
public override MarshalByRefObject CreateInstance(Type serverType) {
return null;
}
}
[MyFunnyProxy]
class MyFunnyType : ContextBoundObject { }
この状態で
new()
の呼び出しはプロキシにリダイレクトされます (
MyFunnyProxyAttribute
を返します。
null
. さあ、目を洗ってきてください。
関連
-
[解決済み] .NETコンソールアプリケーションでアプリケーションのパスを取得するにはどうすればよいですか?
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
-
[解決済み] C#の文字列の前にある@は何ですか?
-
[解決済み] C#を使用して.NETで現在のユーザー名を取得する方法は?
-
[解決済み] .NETのManualResetEventとAutoResetEventの違いは何ですか?
-
[解決済み] int.Parse()とConvert.ToInt32の主な違いは何ですか?
-
[解決済み] .NETでコンソールアプリケーションの終了コードを指定するにはどうすればよいですか?
-
[解決済み] .NET Core、.NET Framework、Xamarinの違いとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] C#や.NETで最悪のガチャは何ですか?[クローズド]
-
[解決済み】「if」文が多すぎる?
-
[解決済み】"this "キーワードはいつ使う?[クローズド]
-
[解決済み】TypeLoadExceptionが「実装がない」というが、実装はされている