Skip to content

Instantly share code, notes, and snippets.

@naratteu
Created April 23, 2025 06:32
Show Gist options
  • Save naratteu/6698682bbd2242a1f09300db533ed119 to your computer and use it in GitHub Desktop.
Save naratteu/6698682bbd2242a1f09300db533ed119 to your computer and use it in GitHub Desktop.
where is generic nullable type constraint
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [
{
"data": {
"text/html": [
"<details open=\"open\" class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>{ a = , b = , d = }</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>a</td><td><div class=\"dni-plaintext\"><pre>&lt;null&gt;</pre></div></td></tr><tr><td>b</td><td><div class=\"dni-plaintext\"><pre>&lt;null&gt;</pre></div></td></tr><tr><td>d</td><td><div class=\"dni-plaintext\"><pre>&lt;null&gt;</pre></div></td></tr></tbody></table></div></details><style>\r\n",
".dni-code-hint {\r\n",
" font-style: italic;\r\n",
" overflow: hidden;\r\n",
" white-space: nowrap;\r\n",
"}\r\n",
".dni-treeview {\r\n",
" white-space: nowrap;\r\n",
"}\r\n",
".dni-treeview td {\r\n",
" vertical-align: top;\r\n",
" text-align: start;\r\n",
"}\r\n",
"details.dni-treeview {\r\n",
" padding-left: 1em;\r\n",
"}\r\n",
"table td {\r\n",
" text-align: start;\r\n",
"}\r\n",
"table tr { \r\n",
" vertical-align: top; \r\n",
" margin: 0em 0px;\r\n",
"}\r\n",
"table tr td pre \r\n",
"{ \r\n",
" vertical-align: top !important; \r\n",
" margin: 0em 0px !important;\r\n",
"} \r\n",
"table th {\r\n",
" text-align: start;\r\n",
"}\r\n",
"</style>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#nullable enable\n",
"class A();\n",
"T? GetNull<T>(in T? t = default) where T : struct => t;\n",
"T? GetNull<T>(in T? t = default) where T : class => t;\n",
"new\n",
"{\n",
" a = GetNull<A>(),\n",
" b = GetNull<int>(),\n",
" d = GetNull<(int a, int b)>(),\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [
{
"ename": "Error",
"evalue": "(4,4): error CS0111: Type 'Submission#6' already defines a member called 'GetNull2' with the same parameter types",
"output_type": "error",
"traceback": [
"(4,4): error CS0111: Type 'Submission#6' already defines a member called 'GetNull2' with the same parameter types"
]
}
],
"source": [
"#nullable enable\n",
"class A();\n",
"T? GetNull2<T>() where T : struct => default;\n",
"T? GetNull2<T>() where T : class => default;\n",
"new\n",
"{\n",
" a = GetNull2<A>(),\n",
" b = GetNull2<int>(),\n",
" d = GetNull2<(int a, int b)>(),\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [
{
"data": {
"text/html": [
"<details open=\"open\" class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>{ a = , b = , d = }</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>a</td><td><div class=\"dni-plaintext\"><pre>&lt;null&gt;</pre></div></td></tr><tr><td>b</td><td><div class=\"dni-plaintext\"><pre>&lt;null&gt;</pre></div></td></tr><tr><td>d</td><td><div class=\"dni-plaintext\"><pre>&lt;null&gt;</pre></div></td></tr></tbody></table></div></details><style>\r\n",
".dni-code-hint {\r\n",
" font-style: italic;\r\n",
" overflow: hidden;\r\n",
" white-space: nowrap;\r\n",
"}\r\n",
".dni-treeview {\r\n",
" white-space: nowrap;\r\n",
"}\r\n",
".dni-treeview td {\r\n",
" vertical-align: top;\r\n",
" text-align: start;\r\n",
"}\r\n",
"details.dni-treeview {\r\n",
" padding-left: 1em;\r\n",
"}\r\n",
"table td {\r\n",
" text-align: start;\r\n",
"}\r\n",
"table tr { \r\n",
" vertical-align: top; \r\n",
" margin: 0em 0px;\r\n",
"}\r\n",
"table tr td pre \r\n",
"{ \r\n",
" vertical-align: top !important; \r\n",
" margin: 0em 0px !important;\r\n",
"} \r\n",
"table th {\r\n",
" text-align: start;\r\n",
"}\r\n",
"</style>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#nullable enable\n",
"class A();\n",
"Func<T>? GetNull3<T>() { return null; }\n",
"\n",
"new\n",
"{\n",
" a = GetNull3<A>()?.Invoke(),\n",
" b = GetNull3<int>()?.Invoke(),\n",
" d = GetNull3<(int a, int b)>()?.Invoke(),\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
},
"polyglot_notebook": {
"kernelName": "csharp"
},
"vscode": {
"languageId": "polyglot-notebook"
}
},
"outputs": [
{
"ename": "Error",
"evalue": "(4,41): error CS8978: 'T' cannot be made nullable.",
"output_type": "error",
"traceback": [
"(4,41): error CS8978: 'T' cannot be made nullable."
]
}
],
"source": [
"#nullable enable\n",
"class A();\n",
"Func<T>? GetNull3<T>() { return null; }\n",
"T? GetNull4<T>() { return GetNull3<T>()?.Invoke(); }\n",
"new\n",
"{\n",
" a = GetNull4<A>(),\n",
" b = GetNull4<int>(),\n",
" d = GetNull4<(int a, int b)>(),\n",
"}"
]
}
],
"metadata": {
"kernelInfo": {
"defaultKernelName": null,
"items": [
{
"aliases": [
"c#",
"cs"
],
"languageName": "C#",
"name": "csharp"
},
{
"aliases": [
"f#",
"fs"
],
"languageName": "F#",
"name": "fsharp"
},
{
"languageName": "HTML",
"name": "html"
},
{
"languageName": "HTTP",
"name": "http"
},
{
"aliases": [
"js"
],
"languageName": "JavaScript",
"name": "javascript"
},
{
"languageName": "Mermaid",
"name": "mermaid"
},
{
"aliases": [
"powershell"
],
"languageName": "PowerShell",
"name": "pwsh"
},
{
"name": "value"
}
]
},
"kernelspec": {
"display_name": ".NET (C#)",
"language": "C#",
"name": ".net-csharp"
},
"language_info": {
"name": "python"
},
"polyglot_notebook": {
"kernelInfo": {
"defaultKernelName": "csharp",
"items": [
{
"aliases": [],
"languageName": "csharp",
"name": "csharp"
},
{
"aliases": [
"f#",
"fs"
],
"languageName": "F#",
"name": "fsharp"
},
{
"aliases": [],
"languageName": "HTML",
"name": "html"
},
{
"aliases": [],
"languageName": "HTTP",
"name": "http"
},
{
"aliases": [
"js"
],
"languageName": "JavaScript",
"name": "javascript"
},
{
"aliases": [],
"languageName": "Mermaid",
"name": "mermaid"
},
{
"aliases": [
"powershell"
],
"languageName": "PowerShell",
"name": "pwsh"
},
{
"aliases": [],
"name": "value"
}
]
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment